Atcoder abc260
https://atcoder.jp/contests/abc260/tasks
Ex - Colorfulness
n球, 颜色ci
f(球的一个排列) = 相邻不同色的个数
对于k=1..m分别求 $\sum(f(排列)^k)$ mod 998244353
范围
n 2.5e5
m 2.5e5
ci [1,n]
8s
1024mb
我的思路
k==1 时
那颜色可以分开考虑
一个颜色 去计算它能构成x个间隔, 那么它每个贡献 (x+1(两端))/2, 再乘上方案数
注意每个排列的最左和最右还要-1, 所以还要减 n!
k==2时
明显就不一样了, 因为贡献变成了 (相邻不同色)^2
颜色c 有 x间隔 ( (x+1) + 其它颜色间隔贡献 -1)^2
问题 其它颜色贡献会受到颜色c的间隔数x 影响
如果直接按照题目来, 按f(P)归类
如果能算出 不同为y个的 出现次数t(y)
那么 就是 f(1) = sum t(y) * y
f(2) = sum t(y) * y^2
这样做也是 需要O(n m) 的
而且怎么算不同出现次数也没啥想法
题解
注意到如果只看颜色的话, 一个方案 对应的实际排列 总是乘上 所有颜色个数的阶乘的积, 所以可以把这个 颜色个数的阶乘的积 提出来, 看成没有差别的同色小球
也是先计算$t_i =$ 有多少个排列会有i个不同的相邻颜色
然后再基于t 计算 和
计算排列出现次数
直接算$t$有点难, 先定义两个序列p,q
pi= 指定i个相邻同颜色(未指定的异色) 的排列数
qi= 指定i个相邻同颜色(未指定的任意) 的排列数
, 注意这里不是>=i个, 比如 1=2=3 在指定1个相邻想等时, 1=2里会被统计一次, 2=3里也会被统计一次,
显然 $t_i = p_{N-1-i}$
有 $q_n = \sum_{k=n}^{N-1} \binom{k}{n} p_k$
根据容斥/二项式反演, 有
$p_n = \sum_{k=n}^{N-1} (-1)^{k-n} \binom{k}{n} q_k$
可以卷积O(n log n) , abc272里有(虽然在260后面, 但我先补的272
所以如何计算q
$m_i$ 为第$i$种颜色的个数
$k_i$ 为第$i$种颜色指定的 相邻相同的个数
$a_{c,k} = \binom{m_c-1}{k}$ 颜色c中指定了k个
$q_n = \sum_{k_1, k_2, \dots, k_N ,\sum_{c} k_c = n} \left(\binom{N-n}{m_1-k_1, m_2-k_2, \dots, m_N-k_N}\prod_{c} a_{c,k_c} \right) = (N-n)! \sum_{k_1, k_2, \dots, k_N ,\sum_{c} k_c = n} \prod_{c} \frac{a_{c,k_c}}{(m_c-k_c)!}$
那么指定后,如果把相邻的看成不可变顺序的多个整体, 那么就是 $N-n$个位置中 放置$m_i-k_i$ 个不可变顺序的整体 !!!! 这样就不会不同颜色之间有影响了!!! (之前因为一个颜色是否连会影像空隙个数, 从而影响其它颜色的空隙个数), 这是上面公式的 左边binom
右边就是每个颜色内, $m_c-1$个相邻位置指定$k_c$个, 这里要注意的是, 可能有的颜色为0个, 这种不会出现在c里,
看到 是prod的sum, 每个prod 只和$c$有关, 那么就是生成函数的方向
用$r_i$对它颠倒 $r_i = q_{N-i}$, 有$r_0=q_N=0$
$r_n = n! \sum_{k_1, k_2, \dots, k_N ,\sum_{c} k_c = n} \prod_{c} \frac{a_{c,m_c-k_c}}{k_c!}$
这里$n$的意义变了, 我觉得用 $\mathrm{new} k_i = m_i- \mathrm{old} k_i$ 看起来变化更自然
注意到$k_c$原来 的范围是$[0,m_c-1]$, 现在变成$[1,m_c]$, 注意到如果$\mathrm{new} k_c \equiv 0$ 那么对应是不合法情况 $\frac{a_{c,m_c}}{k_c!} = \frac{\binom{m_c-1}{m_c}}{k_c!}$ , 方便起见, 令$a_{m-1,m} = 0$ 即可, 所以$k_c$的值域范围变成$[0,m_c]$
做生成函数 $g_c(x) = \sum_{k=0}^{m_c} \frac{a_{c,m_c-k}}{k!} x^k,$
那么$r_n = n! \times [x^n] \prod_{c} g_c(x).$
所以 右侧直接 分治计算生成方程, 可以O(n log n) 算出
至此,$t_i$ 可以算出
n次方带系数和
方程到很直接, 显然$F(n) = \sum_{k=0}^{N-1} k^n t_k.$
现在子问题就是 给定$N$和序列$t$, 求 $F(1\cdots 2.5\cdot10^5)$
把$F(n)$看成生成方程的系数
$\begin{aligned} &f(x) \\ &=\sum_{n=0}^\infty F(n) x^n \\ &=\sum_{n=0}^\infty \left( \sum_{k=0}^{N-1} k^n a_k \right) x^n \\ &=\sum_{k=0}^{N-1} a_k \left( \sum_{n=0}^\infty (kx)^n\right) \\ &=\sum_{k=0}^{N-1} \left(\frac{a_k}{1-kx}\right). \end{aligned}$
之前遇到过乘积拆和的$\frac{c}{(1-x)(1-2x)\cdots}$, 这里是和变乘积, 需要搞一个 $f(x) = \frac{s(x)}{t(x)}$,
同样分治搞一搞 就可以得到$s$和$t$了
好家伙, abc272 我自己找资料学了如何算 生成函数的 倒数, 看来还是应该按照顺序补题, 这里题解里竟然还有教学
然后 变成$s(x) \cdot t^{-1}(x)$ 即可
总结
这场现场过了A-F, 赛后超时过了G, 就Ex不会
Ex
好像第二次遇到二项式反演, 虽然也是容斥的一部分, 但感觉 这种等于变成 大于等于 或者小于等于的转化 还是可以抽出一个类别
不过第一部分的计算, 应该已经都是学过的知识了没有新知识, 虽然只学了一两次, 还是不熟
然后这里 其实要求那么多值 反而很明显应该向 $F$看成系数去想, 然后球和换元的那里感觉是个我的瓶颈 没想到
参考
/algo/Newton_s_method