交错排列型容斥
引例:\(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)\)。
如果有知道为什么上式成立的大佬可以在下面评论,博主不胜感激。