[SOJ638] 小 p 与染色【动态规划】【生成函数】

娃娃机毒瘤qwq

题意简述:对每个\(m\in[1, r]\),求所有\(n\)个点的无向图,染成\(m\)种颜色,满足任意边两端节点颜色不同的方案数,对\(998244353\)取模。\(n\leq 8000, r\leq 10^6\)

先对节点染色,再考虑连边情况。由此可以得到一个比较显然的dp:设\(f_{i, j}\)为实际使用了\(i\)种颜色(即每种颜色至少染了一个点),染\(j\)个点的方案数,转移时枚举新增的点数\(k\),则:

\[f_{i, j}=\sum_{k=1}^{j} f_{i-1, j - k}\cdot \binom{n-j+k}{k} \cdot 2^{(j-k)\cdot k}\]

即,从未染色的\(n-j+k\)个点中选择本次新染色的\(k\)个点,则这\(k\)个点与原来的\(j-k\)个点之间的边均可以选择连或不连。

\(g_i=f_{i, n}\),则\(m\)种颜色(有些颜色可以不用)染色的方案数为\(ans_m=\sum_{i=1}^{m} g_i\cdot \binom{m}{i}\)

以上是一个\(O(n^3+nr)\)的暴力做法,可以获得\(60\)分。

考虑一个长度为\(m\)的颜色序列\(t\),满足\(\sum_{i=1}^m t_i = n\)\(\forall t_i > 0\),则满足这个颜色序列的方案数为:

\[\frac{n!\cdot 2^{\binom{n}{2}}}{\prod_{i=1}^m t_i!\cdot 2^{\binom{t_i}{2}}}\]

从中可以看出一个显然的生成函数形式(与指数生成函数类似):

\(f(x)=\sum_{i=1}^{\infty} \frac{x^i}{i!\cdot 2^{\binom{i}{2}}}\),则\(g_i=n!\cdot 2^{\binom{n}{2}}\cdot [x^n] f^i(x)\)

现在要求出\(i\in[1, n]\)的所有\(g_i\),暴力 \(\operatorname{ntt}\) 的复杂度是\(O(n^2\log n)\)的,难以通过。

发现我们只需要求\(f^i(x)\)的第\(n\)项系数,而如果已知\(f^u(x)\)\(f^v(x)\),满足\(u+v=i\),我们可以直接展开多项式乘法,\(O(n)\)求出这一项。

这启发我们预处理一些\(f^u(x)\),满足任意的\(i\in[1, n]\)都可以找到预处理好的\(u+v=i\)

很容易想到根号分治,即设\(B=\sqrt{n}\),对\(i\in[0, B]\)预处理\(f^{i}(x)\)\(f^{i\cdot B}(x)\)

预处理复杂度\(O(n\sqrt{n}\log n)\),求\(g\)复杂度\(O(n^2)\)

对于\(ans_m=\sum_{i=1}^{m} g_i\cdot \binom{m}{i}\),拆分组合数得到\(ans_m=m!\sum_{i=1}^m\frac{g_i}{i!}\cdot\frac{1}{(m-i)!}\)\(\operatorname{ntt}\)一下即可,复杂度\(O(r\log r)\)

猜你喜欢

转载自www.cnblogs.com/suwakow/p/11640493.html