题目链接
做法
做反演题已经做到看到恰好就非常敏感了。
令$g_i$表示出现恰好$S$次的颜色至少$i$种的方案数,$f_i$表示出现恰好$S$次的颜色恰好$i$种的方案数。
先计算$g_i$,我们就钦定这些颜色是哪些颜色,哪些位置,其他随便放就行了。
而显然
二项式反演就可以得到
而现在我们要求的就是$f_{0..m}$,如果直接算的话复杂度为$m^2$。
可以把$f$数组看成一个多项式,由$g$这个多项式乘上另一个多项式得到。
考虑如何构造多项式。
先把枚举$j$改为枚举$j-i$,从0开始比较方便多项式乘法。
组合数也不好处理,用阶乘暴力展开,那么原式可以化为
发现$(i+j)!$和$g_{i+j}$都与$i+j$有关,那么把它们合并,再转个头即$g’_i=g_{m-i}*(m-i)!$
而$\frac{1}{i!}$至于i有关,那么我们算出f后再乘上就行了,暂时不用管。
经过上面两步的变换后,式子变成了这样
发现还是对不上,我们把$f$也转个头,即$f’_{m-i}=f_i$,那么
就是一个标准的卷积形式了。
我们$NTT$做完后,把上面那些操作都做逆操作就可以了。
最后注意一下$1004535809$这个模数的原根也是$3$
代码
1 |
|