码迷,mamicode.com
首页 > 其他好文 > 详细

交错排列型容斥

时间:2020-02-03 20:44:53      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:class   必须   复杂度   组合   本质   display   step   time   地址   

交错排列型容斥

引例:\(n\) 种颜色的球分别 \(a_i\) 个,相邻不同色,排列,方案数。

\(m=\sum a_i\le 10^5\)

首先考虑题目中的限制条件是什么,对于单种颜色的球从左往右看,第 \(i\) 个跟第 \(i+1\) 个不相邻,那么该颜色就对应着 \(a_i-1\) 个限制。

普通容斥,也就是枚举打破多少限制
\[ \sum_{b_1\sim b_n,b_i\in[0,a_i-1]} \prod_{i=1}^n(-1)^{b_i}{a_i-1\choose b_i}\times {(\sum a_i-b_i)!\over \prod_{i=1}^n (a_i-b_i)!} \]
换成枚举 \(c_i=a_i-b_i\),然后 \(c_i\) 的意义是说第 \(i\) 个颜色强制缩成这么多个段。
\[ \sum_{c_1\sim c_n,c_i\in [1,a_i]} (\sum c_i)!\prod_{i=1}^n(-1)^{a_i-c_i}{(a_i-1)!\over (a_i-c_i)!(c_i-1)!}{1\over c_i!} \]
注意到可以按 \(\sum c_i\) 统计答案,那么构造关于后式的普通生成函数
\[ F_i(x)=\sum_{j=1}^{a_i}(-1)^{a_i-j}{(a_i-1)!\over (a_i-j)!(j-1)!j!}x^j \]
用分治 ntt 卷积以后统计答案即可,复杂度 \(O(m\log^2m)\)

当然这个是带标号球的拼接,显然可以直接用指数生成函数来理解,本质是一样的。

2018 集训队作业 - 青春猪头少年不会梦到兔女郎学姐

给定 \(n\) 种颜色的球,第 \(i\) 种颜色的球数量为 \(r_i\) ,对于一种排列方式,贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有贡献和。
\((1,2,1,2)\)\((2,1,2,1)\) 贡献相同但排列方式不同,要分别计算。

\(\sum r_i\le 10^5\)

提交地址:全网没有。

此题极为毒瘤,必须要一步一步做,我们首先考虑不成环的情况。

Step 1

枚举把颜色 \(i\) 切成 \(b_i\) 段,设 \(f(x,y)\) 表示 \(x\) 有序的切成 \(y\) 段的所有方案、每段长度乘积之和。

问题转换为交错排列,直接套用上题的式子,那么有:
\[ \sum_{a_1\sim a_n,a_i\in[1,r_i]}f(r_i,a_i)\sum_{c_1\sim c_n,c_i\in [1,a_i]} (\sum c_i)!\prod_{i=1}^n(-1)^{a_i-c_i}{(a_i-1)!\over (a_i-c_i)!(c_i-1)!}{1\over c_i!} \]
\(c_i\) 整到前面来得到
\[ \sum_{c_1\sim c_n,c_i\in [1,r_i]} (\sum c_i)!\sum_{c_i\le a_i\le r_i}f(r_i,a_i)\prod_{i=1}^n(-1)^{a_i-c_i}{(a_i-1)!\over (a_i-c_i)!(c_i-1)!}{1\over c_i!} \]
那么维护生成函数
\[ F_i(x)=\sum_{j=1}^{r_i}\sum_{j\le a_i\le r_i}f(r_i,a_i)(-1)^{a_i-j}{(a_i-1)!\over (a_i-j)!(j-1)!j!}x^j \]

Step 2

考虑算这个 \(F_i(x)\)\(f(x,y)={x+y-1\choose y-1}\) ,可以结合组合意义理解,那么也可以推卷积计算了。

Step 3

分治 ntt 计算卷积,复杂度 \(O(m\log^2 m)\)

Step 4

要做环上的情况,我们钦定颜色 1 在序列最前头并且结尾不是 1,那么用开头是 1 的 - 开头结尾都是 1 的。

(钦定 \(t\) 个位置为 1 相当于把 \(F_1(x)\) 多项式往左平移 \(t\) 位。)

这样的一种方案,我们可以通过任意旋转的方式遍历所有可行方案,那么我们最终把答案乘以 \(m=\sum r_i\) 即可。

Step 5

然后你发现这样会算重,具体的,一个方案有 \(j\) 段颜色 1,会被每个 1 遍历一遍,所以算重 \(j\) 遍,那么可以在颜色 1 的生成函数中带上 \(1\over j\) 的系数来抵消掉,问题才最终解决。

另外一种未知原理的方法

考虑计算关于序列的生成函数 \(f(x)\), 则 \(ans=m\sum_{j=1}^m (j-1)![x^j]f(j)\)
如果有知道为什么上式成立的大佬可以在下面评论,博主不胜感激。

交错排列型容斥

标签:class   必须   复杂度   组合   本质   display   step   time   地址   

原文地址:https://www.cnblogs.com/bestwyj/p/12257112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!