清华大学生命科学博士就业_已拥有的是全部的生命

清华大学生命科学博士就业_已拥有的是全部的生命不错的组合数学题。同时这也驱使我去看积灰好久的《具体数学》(看了yu大的blog后)。然后看得头秃……得到一个不等式前缀和大于等于取了的个数。所以如果把每个卡的值减一,问题就变成了求一个排列,使得前

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

不错的组合数学题。同时这也驱使我去看积灰好久的《具体数学》(看了yu大的blog后)。然后看得头秃……

得到一个不等式前缀和大于等于取了的个数。所以如果把每个卡的值减一,问题就变成了求一个排列,使得前缀和都非负。

\[\forall i, \mathbf{s.t.} a_1 + a_2 + \dots + a_i \geq 0 \]

显然 \(\sum a_i = 0\)

看样子很难搞。

可以发现,如果把序列循环位移,可能会得到新的方案,那么对每个环进行计算。

但是环可能会贡献多个值,如果这么做,答案就是 \(\sum_{C} f\left(C\right)\),其中 \(C\) 是圆排列, \(f\left(C\right)\) 是断环的方式数,使得前缀和大于等于 \(0\),也等价于找到一个合法的断环方式,此时 \(f\left(C\right)\) 就是使得部分和为 \(0\) 的位置数。

这不就是定义吗?显然一个环的多个贡献给我们的计数造成了麻烦。

考虑转换一下,使环的贡献只能是 \(1\)

如果见过 \(\texttt{Raney}\) 引理,就会发现一个类似的地方:

下面摘自《具体数学》301页 原话:

如果 \(\left< x_1, x_2, \dots , x_m \right>\) 是任何一个其和为 \(+1\) 的整数序列,那么它的循环移位

\[\left< x_1, x_2, \dots , x_m \right>,\left< x_2, \dots ,x_m,x_1 \right>,\dots,\left< x_m, x_1,\dots ,x_{m-1} \right> \]

中恰好有一个满足所有的部分和都是正数。

可以感性理解一下

然后提供了一个例子,就是往卡特兰数计数时,序列最前面加一个 \(1\)。然后容易计数。

这道题的部分和非负,如果在序列前面加个 \(1\),不就是 \(\texttt{Raney}\) 引理了?

我们考虑像这个引理一样,在序列头加一个 \(1\),可以发现,并不是所有地方都能加,例如 \(2,-1,-1\),如果在 \(2\) 后面加 \(1\) 显然是不行的。然后发现加的方案数正好和上面的 \(f\left( C\right)\) 一样——这不是加了跟没加一样?

但是不用担心,我们考虑黑科技,不加 \(1\),改成加 \(-1\)

我们往原序列里插入一个 \({-1}^*\) ,此时问题转换为对圆排列找出一种断环方式,使得前 \(m\) 个的部分和非负,并且元素和为 \(-1\)

易证最后一个必定是 \(-1\),并且用类似方法可以证明一定存在且仅存在一个满足条件的断环方式。(我不会证,逃

由于有标号,有 \(m – n + 1\)\(-1\),于是最后一个 \(-1\) 就有 \(m – n + 1\) 种标号。我们要钦定最后一个 \(-1\)\({-1}^*\),所以答案要除以 \(m – n + 1\)

\(m + 1\) 个元素的圆排列方案数为 \(m!\),于是答案就是 \(\frac{m!}{m – n + 1}\)

复杂度 \(O\left(m\right)\),可以通过此题。

使用快速阶乘可以得到更低的复杂度以及更大的常数。

#include <bits/stdc++.h>

const int mod = 998244353;
typedef long long LL;
int n, m;
int main() {
	std::cin >> n;
	for (int i = 1, t; i <= n; ++i) std::cin >> t, m += t;
	int ans = 1;
	for (int i = 2; i <= m; ++i)
		if (i != m - n + 1)
			ans = (LL) ans * i % mod;
	std::cout << ans << std::endl;
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167479.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos7 网络配置

    centos7 网络配置centos7刚安装,需要做一些配置才能正常上网!1.虚拟网络编辑器配置1)通过VMware菜单栏,依次点击编辑和虚拟网络编辑器2)选中VMnet8,取消勾选使用本地DHCP服务将IP地址分配给虚拟机,查看DHCP确保未启用,点击NAT设置3)查看网关IP,并记住192.168.255.2,用于网络配置文件设置2.修改mac地址如果本虚拟机为克隆机,则需要重新…

    2022年4月28日
    47
  • pycharm安装tensorflow2.0 过程

    pycharm安装tensorflow2.0 过程pycharm安装tf2.0步骤1.安装python3.7.9官网下载,记住安装python.exe的路径官网地址2.配置环境,设置成上一步安装好的.exe文件3.安装tf相关包,点击添加pandsnumpymatplotlibscikit-learntensorflow2.04.测试安装成功,输入代码importtensorflowastfsess=tf.Session()a=tf.constant(1)b=tf.constant(2)p

    2025年6月26日
    3
  • JavaScript数组遍历6 some方法

    JavaScript数组遍历6 some方法上一篇文章我们讲述了every方法,这里我们将会进行讲解some方法和every方法相似some方法也接收2个参数;第一个参数是一个函数第二个参数是一个传入值。其中第一个参数接收3个参数第一个参数是当前值,第二个参数是当前值的索引值,第三个参数是本数组。some方法的使用和every的方法相似但是也有一个返回值,返回当前的数组是否有符合的条件。如果没有返回值,则返回的是undefined。当有一个值满足条件则会停止遍历。下面是使用some方法的例子。<!DOCTYPEhtml><

    2022年10月20日
    2
  • layui的layer弹出层和form表单

    layui的layer弹出层和form表单文章目录弹出层layerform表单增删改查所有代码如果想用layui来完成增删改查,那么要会用弹出层和form表单这两个组件是必须的,所以今天就来介绍一些如何用layui完成基本的增删改查弹出层layer因为layui的特性,每次不管使用哪个组件,都要先把它的模块加载出来比如我要用layer和form那么就需要先这样定义,你的操作都是在这个里面进行,当然页可以一次性加载所有模块,详情…

    2022年7月13日
    20
  • mac idea 2021激活码【2021免费激活】

    (mac idea 2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSWQi…

    2022年3月26日
    51
  • java中数组初始化方法_java数组初始化赋值

    java中数组初始化方法_java数组初始化赋值java中初始化数组的方式有几种发布时间:2020-06-0116:12:45来源:亿速云阅读:153作者:鸽子三种初始化方式:1、静态初始化:创建+赋值2、动态初始化:先创建再赋值3、默认初始化:创建之后若不赋值则会被赋对应数据类型的默认值我们来看一下具体代码:publicclassTest3{publicstaticvoidmain(String[]args){//1、声明…

    2022年10月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号