考虑序列上的问题。
首先考虑枚举数字 i 划分为 ai 段,所有方案的权值之和为 (ci+ai−12ai−1)。
这不难通过组合意义证明:权值可以视作将 ci 个数字划分为 ai 段,再在每一段中选择一个的方案数。
那么这些数字段之间的顺序安排的方案数,即有 ai 个数字 i,相同数字不得相邻的多重集排列数。
对于数字 i,ai 之间没有顺序影响,于是不相邻的限制可以看做 ai−1 对数字 i 不得相邻的限制。
考虑容斥,枚举 bi 表示打破多少限制,那么相当于数字 i 被强制缩为 ai−bi 个段,有 ∑0≤bi≤ai−1n∏i=1(−1)bi(ai−1bi)[∑ni=1(ai−bi)]!(ai−bi)!
综合 ai 的枚举,并改为枚举 di=ai−bi,可得 ∑1≤ai≤ci∑1≤di≤ai(n∑i=1di)!n∏i=1(ci+ai−12ai−1)(−1)ai−di(ai−1)!(ai−di)!(di−1)di!=∑1≤di≤ci(n∑i=1di)!∑di≤ai≤cin∏i=1(−1)ai−di(ci+ai−12ai−1)(ai−1)!(ai−di)!(di−1)!di!
考虑构造生成函数以通过卷积关于 ci 之和统计答案。 Fi(x)=ci∑j=1xj(j−1)!j!ci∑k=j(ci+k−12k−1)(−1)k−j(k−1)!(k−j)!=ci∑j=1xj(j−1)!j!ci−j∑k=0(ci+(j+k)−12(j+k)−1)(j+k−1)!⋅(−1)k1k!
不难构造卷积求出生成函数,再执行分治 NTT 即可。
再考虑环上的问题。可以强制使开头为 1,结尾不为 1,即开头为 1 的减去开头结尾均为 1 的。
分别相当于强制安排了 1,2 段数字 1 的位置,可以对 F1(x) 左移来实现(注意左移不包括那个 1j!,因为强制确定了顺序)。
然后循环移位也要计算贡献,故乘上 n∑i=1ci。
然而这样 i 段 1 的序列会被计算 i 次。在 F1(x) 中乘上 1a1 即可。
代码:
1 |
|