交错排列型容斥
引例:(n) 种颜色的球分别 (a_i) 个,相邻不同色,排列,方案数。
(m=sum a_ile 10^5)
首先考虑题目中的限制条件是什么,对于单种颜色的球从左往右看,第 (i) 个跟第 (i+1) 个不相邻,那么该颜色就对应着 (a_i-1) 个限制。
普通容斥,也就是枚举打破多少限制
换成枚举 (c_i=a_i-b_i),然后 (c_i) 的意义是说第 (i) 个颜色强制缩成这么多个段。
注意到可以按 (sum c_i) 统计答案,那么构造关于后式的普通生成函数
用分治 ntt 卷积以后统计答案即可,复杂度 (O(mlog^2m))。
当然这个是带标号球的拼接,显然可以直接用指数生成函数来理解,本质是一样的。
2018 集训队作业 - 青春猪头少年不会梦到兔女郎学姐
给定 (n) 种颜色的球,第 (i) 种颜色的球数量为 (r_i) ,对于一种排列方式,贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有贡献和。
((1,2,1,2)) 和 ((2,1,2,1)) 贡献相同但排列方式不同,要分别计算。
(sum r_ile 10^5)
提交地址:全网没有。
此题极为毒瘤,必须要一步一步做,我们首先考虑不成环的情况。
Step 1
枚举把颜色 (i) 切成 (b_i) 段,设 (f(x,y)) 表示 (x) 有序的切成 (y) 段的所有方案、每段长度乘积之和。
问题转换为交错排列,直接套用上题的式子,那么有:
把 (c_i) 整到前面来得到
那么维护生成函数
Step 2
考虑算这个 (F_i(x)) 有 (f(x,y)={x+y-1choose y-1}) ,可以结合组合意义理解,那么也可以推卷积计算了。
Step 3
分治 ntt 计算卷积,复杂度 (O(mlog^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 的生成函数中带上 (1over j) 的系数来抵消掉,问题才最终解决。
另外一种未知原理的方法
考虑计算关于序列的生成函数 (f(x)), 则 (ans=msum_{j=1}^m (j-1)![x^j]f(j))。
如果有知道为什么上式成立的大佬可以在下面评论,博主不胜感激。