zoukankan      html  css  js  c++  java
  • FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ

    因为垃圾电脑太卡了就重开了一个。。。

    前传:多项式Ⅰ

    u1s1 我预感还会有Ⅲ

    多项式基础操作:

    例题:

    26. CF438E The Child and Binary Tree

    感觉这题作为第一题还蛮合适的(

    首先我们设 \(f_i\) 为权值之和为 \(i\) 的符合要求的二叉树的个数。

    显然可以枚举根节点的权值、左子树的权值之和进行转移。

    也就是 \(f_i=\sum\limits_{x\in S}\sum\limits_{y=0}^{i-S}f_yf_{i-x-y}\)

    如果我们记 \(g_i\) 表示 \(i\) 是否在 \(S\) 当中出现过。

    那么上式可化简为 \(f_i=\sum\limits_{x+y+z=i}g_xf_yf_z\)

    边界条件 \(f_0=1\)

    \(F,G\) 分别为 \(f_i,g_i\) 的生成函数,那么 \(F=F^2G+1\)

    移项,得 \(F^2G-F+1=0\)

    两边同时乘 \(4G\),得 \(4F^2G^2-4FG+4G=0\)

    配方,得 \((2FG-1)^2=1-4G\)

    直接开平方,得 \(2FG-1=\sqrt{1-4G}\)\(2FG-1=-\sqrt{1-4G}\)

    也就是说 \(2FG=1+\sqrt{1-4G}\)\(2FG=1-\sqrt{1-4G}\)

    由于 \(g_0=0\)\(2FG\) 的常数项也是 \(0\),故排除正根,也就是说 \(2FG=1-\sqrt{1-4G}\)

    左右两边同乘 \(1+\sqrt{1-4G}\),得 \(2FG(1+\sqrt{1-4G})=4G\)

    移项,得 \(2G(F(1+\sqrt{1-4G})-2)=0\)

    显然 \(G\neq 0\),所以 \(F(1+\sqrt{1-4G})-2=0\)

    \(F=\dfrac{2}{1+\sqrt{1-4G}}\)

    一遍多项式 sqrt,一遍多项式求逆即可。

    大功告成。

    yyq 既视感,有 yyq 内味儿了

    27. P4389 付公主的背包

    这题我竟然自己想出来了,incredible!

    考虑设 \(f_i\) 为选择的物品体积为 \(i\) 的方案数。

    根据生成函数的知识显然有 \(F=(1+x^{v_1}+x^{2v_1}+x^{3v_1}+\dots)(1+x^{v_2}+x^{2v_2}+x^{3v_2}+\dots)\dots(1+x^{v_n}+x^{2v_n}+x^{3v_n}+\dots)\)

    式子很容易理解,还是采用“取括号的方法”来理解,第一个括号取 \(1\) 相当于 \(1\) 号物品选了 \(0\) 个,取 \(x^{v_1}\) 相当于 \(1\) 号物品选了 \(1\) 个,取 \(x^{2v_1}\) 相当于 \(1\) 号物品选了 \(2\) 个,以此类推。

    而根据 \(\dfrac{1}{1-x}=1+x+x^2+x^3+\dots\)

    可得 \(1+x^v+x^{2v}+x^{3v}+\dots=\dfrac{1}{1-x^v}\)

    \(F=\prod\limits_{i=1}^n\dfrac{1}{1-x^{v_i}}\)

    现在我们的目标就是求出 \((1-x^{v_1})(1-x^{v^2})(1-x^{v_3})\dots(1-x^{v_n})\)

    暴力 NTT 显然不行,但是……看到这几个二项式相乘的形式恁不觉得很熟悉吗?

    \(\ln(1+x)=x-\dfrac{x^2}{2}+\dfrac{x^3}{3}-\dfrac{x^4}{4}+\dots\)

    \(T=\ln((1-x^{v_1})(1-x^{v^2})(1-x^{v_3})\dots(1-x^{v_n}))\)

    那么根据 \(\ln\) 的性质有 \(T=\ln(1-x^{v_1})+\ln(1-x^{v_2})+\dots+\ln(1-x^{v_n})\)

    \(-x^{v}\) 代入 \(\ln(1+x)\) 可得 \(\ln(1-x^v)=-x^v-\dfrac{x^{2v}}{2}-\dfrac{x^{3v}}{3}-\dfrac{x^{4v}}{4}-\dots\) 由于我们要求 \(F\bmod x^{m+1}\) 的值,所以我们只用枚举到第 \(\lfloor\dfrac{m+1}{v}\rfloor\) 就行了。

    这样多项式乘法就变成了多项式加法,求出 \(T\) 之后对 \(T\) 求一个 \(\exp\),再求个逆就可以得到 \(F\) 了。

    还有个小问题,就是如果 \(v_i\) 都是很小的数,这样求一遍 \(\ln(1-x^v)\)\(\mathcal O(m)\) 级别的,直接死掉。

    不过这个问题非常容易解决,开个桶 \(c_i\) 记录一下 \(i\)\(v\) 数组中出现了多少次,然后将 \(c_i\ln(1-x^i)\) 累加进 \(T\) 就行了,这样复杂度为 \(\dfrac{m}{1}+\dfrac{m}{2}+\dots+\dfrac{m}{m}=m\ln m\)

    28. P5860 「SWTR-03」Counting Trees

    ……有什么意义吗?

    当时这题 std 是我写的,当时觉得多项式好神仙啊%%%,现在看感觉自己当时好 naive。。。

    当然这话不是在说多项式不神仙,只是觉得当时自己没怎么见过世面,感叹自己当时的菜

    根据 prufer 序列可得度数分别为 \(d_1,d_2,\dots,d_m\) 的点可以构成一棵树,当且仅当 \(\sum\limits_{i=1}^md_i-2=-2\)

    于是此题就转化为一个 01 背包问题,构造生成函数 \(F=\prod\limits_{i=1}^nx^{d_i-2}\),求 \(F\)\(x^{-2}\) 的系数。

    其它的都和上一题差不多,只是这个负数下标处理有点不太一样。

    我是这么处理的,显然只有 \(d_i=1\) 的时候会出现负数下标,于是枚举选择 \(i\)\(1\),将 \(d_i\geq 2\) 的部分跑一遍背包,然后求出背包 \(x^{i-2}\) 的系数即可。

    29. P4841 [集训队作业2013]城市规划

    又独立搞掉一道黑题,incredible!

    \(1004535809\) hopping

    \(f_i\)\(i\) 个点组成的带点标号的连通图的个数,再记 \(g_i\)\(i\) 个点组成的带点标号的无向图的个数。

    枚举 \(1\) 所在的连通块的大小,可得 \(g_n=\sum\limits_{i=1}^n\dbinom{n-1}{i-1}f_ig_{n-i}\)

    把组合数拆开,可得 \(g_n=\sum\limits_{i=1}^n\dfrac{(n-1)!}{(i-1)!(n-i)!}f_ig_{n-i}\)

    稍微变个形可得 \(\dfrac{g_n}{(n-1)!}=\sum\limits_{i=1}^n\dfrac{f_i}{(i-1)!}\times\dfrac{g_{n-i}}{(n-i)!}\)

    \(A_i=\dfrac{g_i}{(i-1)!},B_i=\dfrac{f_i}{(i-1)!},C_i=\dfrac{g_i}{i!}\)

    \(A=B\times C\)

    而显然 \(g_i=2^{\binom{i}{2}}\)

    \(A,C\) 都可以直接求出,多项式求逆一遍即可得到 \(B\)

    然后输出 \(B_n\times (n-1)!\)

    30. CF623E Transforming Sequence

    感觉这题应该放到「多项式乘法」中,因为此题其实不需要多项式。

    显然 \(n>k\) 的时候答案为 \(0\)

    \(dp_{i,j}\) 为在前 \(i\) 个数的按位或中有 \(j\) 位为 \(1\) 的方案数。

    转移方程:\(dp_{i,j}=\sum\limits_{k=0}^{j-1}dp_{i-1,k}\times\dbinom{j}{k}\times2^{k}\)

    介绍一下我的错误解法吧:

    将组合数拆开,\(dp_{i,j}=\sum\limits_{k=0}^{j-1}dp_{i-1,k}\times\dfrac{j!}{k!(j-k)!}\times2^{k}\)

    将带 \(k\) 的归为一类,不带 \(k\) 的归为一类,可得 \(dp_{i,j}=j!\times\sum\limits_{k=1}^{j-1}\dfrac{dp_{i-1,k}\times 2^k}{k!}\times\dfrac{1}{(j-k)!}\)

    虽然这玩意儿可以用卷积优化,但是这样从 \(dp_{i-1}\) 转移到 \(dp_i\) 还是 \(\mathcal O(k\log k)\) 的。

    然后就一直在那儿想怎样直接优化上述 \(dp\) 式子,就彻底 zbl。


    在上述错误解法中,我们是从 \(dp_{i}\) 转移到 \(dp_{i+1}\) 的,要 \(n\) 次才能推到 \(dp_n\)

    那假如我们不转移到 \(dp_{i+1}\),而转移到 \(dp_{i+j}\) 呢?

    考虑用 \(dp_x\)\(dp_y\) 的值求出 \(dp_{x+y}\) 的值。

    仿照上式则有 \(dp_{x+y,j}=\sum\limits_{k=0}^{j-1}dp_{x,k}\times dp_{y,k}\times\dbinom{j}{k}\times 2^k\)

    这样我们可以从 \(dp_n\) 转移到 \(dp_{2n}\),用倍增的思想即可解决此题。

    时间复杂度 \(\mathcal O(k\log n\log k)\)

    31. CF755G PolandBall and Many Other Balls

    其实和上一题差不多吧。。。

    \(dp_{i,j}\) 表示前 \(i\) 个球分成 \(j\) 组的方案数。

    首先有一个很 naive 的 \(dp\) 转移,\(dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}+dp_{i-2,j-1}\),但很显然没啥办法优化。

    考虑借鉴上一题的办法,从 \(dp_{x}\)\(dp_{y}\) 转移到 \(dp_{x+y,k}\)

    分接缝处组成一组和接缝处不组成一组的情况,即 \(dp_{x+y,i}=\sum\limits_{k=0}^idp_{x,k}\times dp_{y,i-k}+\sum\limits_{k=0}^{i-1}dp_{x-1,k}\times dp_{y-1,i-k-1}\)

    \(F_i\)\(dp_i\) 的生成函数,那么有 \(F_{x+y}=F_xF_y+xF_{x-1}F_{y-1}\)

    但这样一来就有一个问题了,\(F_{x+y}\) 的转移式中不仅有 \(F_x,F_y\),还有 \(F_{x-1}\)\(F_{y-1}\),这可怎么办呢?

    然后我就完美地死在了这个地方。

    其实是一个非常 sb 的问题,你在求 \(F_x\) 的时候同时把 \(F_{x-1}\) 的值求出来就行了。

    那这样一来又有问题了,你求 \(F_{x+y}\) 的时候同时也要把 \(F_{x+y-1}\) 的值求出来,那 \(F_{x+y-1}\) 的值怎么求呢?

    这个问题也异常容易,\(F_{x+y-1}=F_xF_{y-1}+xF_{x-1}F_{y-2}\),所以你再记录个 \(F_{x-2}\) 即可。而 \(F_{x+y-2}=F_{x-1}F_{y-1}+xF_{x-2}F_{y-2}\),于是你可以 \(\mathcal O(n\log n)\) 地用 \((F_x,F_{x-1},F_{x-2})\)\((F_{y},F_{y-1},F_{y-2})\) 求出 \((F_{x+y},F_{x+y-1},F_{x+y-2})\) 了。再套个倍增即可通过此题。

    时间复杂度 \(\mathcal O(n\log^2n)\)

    32. CF773F Test Data Generation

    又是一道这种类型的题。。。

    \(\dfrac{a_n}{g}-n\)\(\dfrac{a_n}{g}\) 奇偶性不同当且仅当 \(n\) 为奇数

    \(a_n-n\)\(\dfrac{a_n}{g}-n\) 奇偶性不同当且仅当 \(a_n\) 为偶数并且 \(g\) 中包含了 \(a_n\) 中的所有 \(2\)

    考虑枚举 \(a_n\) 质因数分解形式中 \(2\) 的次数 \(k\),显然 \(a_1,a_2,\dots,a_n\) 都应当是 \(2^k\) 的倍数并且 \(\dfrac{a_n}{2^k}\) 应当为奇数。

    于是等价于从 \([1,\lfloor\dfrac{max_a}{2^k}\rfloor]\) 中选择奇数个数,最大的数为奇数的方案数。

    考虑 \(dp_{i,p,j}\) 表示从 \([1,i]\) 中选 \(x\) 个数,最大的数奇偶性为 \(p\) 的方案数,\(0\) 为奇数,\(1\) 为偶数。

    那么这个方案数即为 \(\sum\limits_{x\text{为奇数}}dp_{\lfloor\frac{max_a}{2^k}\rfloor,1,x}\)

    考虑从 \(dp_{x}\)\(dp_y\) 求出 \(dp_{x+y}\),那么有:

    \[dp_{x+y,p,j}=dp_{x,p,j}+\sum\limits_{i=1}^{j-1}(dp_{x,0,i}+dp_{x,1,i})\times dp_{y,p\oplus(x\& 1),j-i}+dp_{{y,p\oplus(x\& 1),j}} \]

    转移方程一看就懂,\(dp_{x,p,j}\) 表示不选 \(>x\) 的数的方案数,中间那个 \(\sum\) 枚举选择了多少个 \(\leq x\) 的数,显然在这种情况下 \(\leq x\) 的最大的数的奇偶性是什么并不重要,于是左边部分的贡献就是 \(dp_{x,0,i}+dp_{x,1,i}\),而大于 \(x\) 小于 \(x+y\) 的部分等价于选择在 \([1,y]\) 的数并将其加上 \(x\),就是 \(dp_{y,p\oplus(x\& 1),j-i}\),最后 \(dp_{{y,p\oplus(x\& 1),j}}\) 表示不选 \(\leq x\) 的方案数。

    如果我们记 \(F_{i,p}\)\(dp_{i,p}\) 的生成函数,那么有 \(F_{x+y,p}=F_{x,p}+(F_{x,0}+F_{x,1}+1)\times F_{y,p\oplus(x\& 1)}\)

    一脸倍增的样子。于是 2log 倍增转移即可。

    33. P3784 [SDOI2017] 遗忘的集合

    感觉就是付公主的背包的逆操作罢。。。

    首先还是列出 \(f(x)\) 的 OGF:\(f(x)=\dfrac{1}{(1-x^{a_1})(1-x^{a_2})(1-x^{a_3})\dots(1-x^{a_n})}\)

    两边同时取 \(\ln\) 可得 \(\ln f(x)=-\ln(1-x^{a_1})-\ln(1-x^{a_2})-\dots-\ln(1-x^{a_n})\)

    \(-\ln(1-x^v)=\sum\limits_{n\geq 0}\dfrac{x^{nv}}{n}\)

    \(f(x)\) 求个 \(\ln\),再随便瞎搞搞就可以求出 \(a_i\)

    很烦的一点是又要写任意模数 NTT。

    组合数的一些知识

    到这里,我们来讲讲一些组合数的知识。

    组合数

    定义 \(\dbinom{n}{m}\) 为从大小为 \(n\) 的集合中选出一个大小为 \(m\) 的子集的个数。

    公式:\(\dbinom{n}{m}=\dfrac{n!}{m!(n-m)!}\)

    考虑任意打乱这个集合,我们钦定前 \(m\) 个被选出来,这样共有 \(n!\) 种可能的情况。

    但这样会重复计算,事实上,如果在此基础上打乱前 \(m\) 个元素或后 \(n-m\) 个元素,还能产生同种选取方案,故每种方案会被重复计算 \(m!(n-m)!\) 次。

    故我们得到了组合数的公式 \(\dbinom{n}{m}=\dfrac{n!}{m!(n-m)!}\)

    如果我们把阶乘拆开又有 \(\dbinom{n}{m}=\dfrac{n\times (n-1)\times (n-2)\times\dots\times(n-m+1)}{m\times (m-1)\times (m-2)\times\dots\times 2\times 1}=\dfrac{n^{\underline{m}}}{m!}\)

    一些组合数恒等式:

    一大波恒等式即将来袭

    首先有几个显然的恒等式:

    • \(\dbinom{n}{m}=\dbinom{n}{n-m}\)(选择 \(m\) 个数等价于不选 \(n-m\) 个数)
    • \(\sum\limits_{m=0}^n\dbinom{n}{m}=2^n\)(一个大小为 \(n\) 的集合共有 \(2^n\) 个子集)
    • \(\dbinom{n}{m}=\dfrac{n}{m}\dbinom{n-1}{m-1}\)(选择一个大小为 \(m\) 的子集,再从中这个子集的元素中选一个代表元素,等价于先选一个代表元素,再从另外 \(n-1\) 个元素中选择 \(m-1\) 个元素。),这个恒等式被称为吸收恒等式。

    当然第三个公式还有一个推广:\(\dbinom{n}{m}\times\dbinom{m}{k}=\dbinom{n}{k}\times\dbinom{n-k}{m-k}\)(从大小为 \(n\) 的集合 \(S\) 中选择一个大小为 \(m\) 的子集 \(A\),再从中 \(A\) 中选一个大小为 \(k\) 的子集 \(B\),等价于先从 \(S\) 中选大小为 \(k\) 的子集 \(B\),再从另外 \(n-k\) 个元素中选择 \(m-k\) 个元素组成 \(A-B\)。)


    组合数还有一个递推式:\(\dbinom{n}{m}=\dbinom{n-1}{m}+\dbinom{n-1}{m-1}\)(Tips:考虑最后一个元素选还是不选。如果选那就在前 \(n-1\) 个元素中选择 \(m-1\) 个元素;如果不选那就在前 \(n-1\) 个元素中选择 \(m\) 个元素)

    下面还有两个由组合数递推式衍生出来的恒等式,借助帕斯卡三角形可以更好地理解它们:

    • \(\sum\limits_{i=0}^m\dbinom{n+i}{i}=\dbinom{n+m+1}{m}\)(从帕斯卡三角形第 \(n\) 行最开头的元素开始,沿右下方向走 \(m+1\) 步,经过的位置上的数之和等于结尾位置下方的数)(Tips:\(\dbinom{n}{0}=\dbinom{n+1}{0}=1\)\(\dbinom{n+1}{0}+\dbinom{n+1}{1}=\dbinom{n+2}{1}\)\(\dbinom{n+2}{1}+\dbinom{n+2}{2}=\dbinom{n+3}{2}\)\(\dbinom{n+3}{2}+\dbinom{n+3}{3}=\dbinom{n+4}{3}\),如此递推下去即可得到结论)

    • \(\sum\limits_{i=0}^n\dbinom{m+i}{m}=\dbinom{m+n+1}{m+1}\)(从帕斯卡三角形第 \(n\) 行最右端的元素开始往下走 \(n\) 步,经过的位置上的数之和等于结尾位置右下方的数)(Tips:\(\dbinom{m}{m}=\dbinom{m+1}{m+1}=1\)\(\dbinom{m+1}{m+1}+\dbinom{m+1}{m}=\dbinom{m+2}{m+1}\)\(\dbinom{m+2}{m+1}+\dbinom{m+2}{m}=\dbinom{m+3}{m+1}\),以此类推。)

    二项式定理:

    \((x+y)^k=\sum\limits_{i=0}^k\dbinom{k}{i}x^iy^{k-i}\)

    证明:考虑 \(x^iy^{k-i}\) 一项前面的系数,相当于在 \(k\) 个括号中有 \(i\) 个选择 \(x\),另外 \(k-i\) 个选择 \(y\),选法数为 \(\dbinom{k}{i}\)

    注意 \(1\) 的幂在求和过程中可能会被隐藏起来。

    34. CF660E Different Subsets For All Tuples

    一道不那么一眼的 *2300

    首先考虑怎样计算答案。空序列的贡献 \(m^n\) 显然可以单独计算。然后对于每个序列,我们只用计算它第一次出现时候的贡献即可。

    我们枚举这个子序列的长度 \(len\),然后枚举它在原序列第一次出现的位置中,第一位的位置 \(p_1\) 和它第一位的值 \(v_1\)——由于是第一次出现,所以原序列第 \(1,2,3,\dots,p_1-1\) 位上的值都不应为 \(v_1\),共有 \((m-1)^{p_1-1}\) 种选择,而 \(v_1\) 共有 \(m\) 种可能的值,所以贡献为 \(m\times (m-1)^{p_1}\)。同理再枚举 \(p_2(p_1<p_2)\)\(v_2\),贡献为 \(m\times (m-1)^{p_2-p_1}\),依次类推。假设最后一位在原序列中的位置为 \(p_{len}\),那么原序列第 \(len+1\) 位到第 \(n\) 位显然想怎么填就怎么填,贡献为 \(m^{n-p_{len}}\)。最后根据乘法原理把所有贡献全乘在一起,可得一种 \(p_1,p_2,\dots,p_{len}\) 对答案的贡献 \((m-1)^{p_{len}-len}\times m^{n-p_{len}+len}\)

    注意到这个贡献只与 \(p_{len}\)\(len\) 有关,所以我们可以枚举 \(p_{len}\)\(len\),那么合法的 \(p_1,p_2,\dots,p_{len-1}\) 应当有 \(\dbinom{p_{len}-1}{len-1}\) 种。故最终我们要求的答案即为(下文中用 \(i\) 代替 \(len\)\(j\) 代替 \(p_{len}\)

    \[\sum\limits_{i=1}^n\sum\limits_{j=i}^n\dbinom{j-1}{i-1}\times (m-1)^{j-i}\times m^{n-j+i} \]

    直接算显然会炸,考虑对原式进行一些变形:

    转换枚举顺序:\(\sum\limits_{j=1}^n\sum\limits_{i=1}^j\dbinom{j-1}{i-1}\times (m-1)^{j-i}\times m^{n-j+i}\)

    \(m^{n-j}\) 提到外面,并将 \(i\) 改为 \(i+1\)\(\sum\limits_{j=1}^nm^{m-j}\times\sum\limits_{i=0}^{j-1}\dbinom{j-1}{i}\times (m-1)^{j-i-1}\times m^{i+1}\)

    再把里面的 \(m^{i+1}\) 拆成 \(m^{i}\times m\)\(\sum\limits_{j=1}^nm^{m-j+1}\times\sum\limits_{i=0}^{j-1}\dbinom{j-1}{i}\times (m-1)^{j-i-1}\times m^i\)

    发现里面那个 \(\sum\) 中的东西长得一脸二项式定理的样子:\(\sum\limits_{j=1}^nm^{m-j+1}\times(2m-1)^{j-1}\)

    大功告成。\(\mathcal O(n\log n)\) 计算显然是没问题的,简单想想也能优化到 \(\mathcal O(n)\)

    二项式反演

    它 终 于 来 了

    其实也不是什么 dl 的东西,一节 yyq 的课就能推出来

    二项式反演说的是这样一件事:若 \(a_k=\sum\limits_{i=0}^k(-1)^i\dbinom{k}{i}b_i\),那么 \(b_k=\sum\limits_{i=0}^k(-1)^i\dbinom{k}{i}a_i\)

    证明:将 \(a_k=\sum\limits_{i=0}^k(-1)^i\dbinom{k}{i}b_i\) 代入 \(\sum\limits_{i=0}^k(-1)^i\dbinom{k}{i}a_i\) 可得:

    \(RHS=\sum\limits_{i=0}^k(-1)^i\dbinom{k}{i}a_i=\sum\limits_{i=0}^k(-1)^i\dbinom{k}{i}\sum\limits_{j=0}^i(-1)^j\dbinom{i}{j}b_j\)

    转换枚举顺序,可得:\(RHS=\sum\limits_{j=0}^kb_j(-1)^j\sum\limits_{i=j}^k\dbinom{k}{i}\dbinom{i}{j}(-1)^i\)

    根据 \(\dbinom{k}{i}\dbinom{i}{j}=\dbinom{k}{j}\dbinom{k-j}{i-j}\),可得:\(RHS=\sum\limits_{j=0}^kb_j(-1)^j\sum\limits_{i=j}^k\dbinom{k}{j}\dbinom{k-j}{i-j}(-1)^i\)

    \(\dbinom{k}{j}\) 提到外面可得:\(RHS=\sum\limits_{j=0}^kb_j(-1)^j\dbinom{k}{j}\sum\limits_{i=j}^k\dbinom{k-j}{i-j}(-1)^i\)

    将里面枚举的 \(i\) 改为 \(i+j\) 可得:\(RHS=\sum\limits_{j=0}^kb_j(-1)^j\dbinom{k}{j}\sum\limits_{i=0}^{k-j}\dbinom{k-j}{i}(-1)^{i+j}\)

    \((-1)^j\) 提到外面,可得 \(RHS=\sum\limits_{j=0}^kb_j\dbinom{k}{j}\sum\limits_{i=0}^{k-j}\dbinom{k-j}{i}(-1)^{i}\)

    观察里面的 \(\sum\),它等于 \(\sum\limits_{i=0}^{k-j}\dbinom{k-j}{i}(-1)^i\times 1^{k-j-i}\)

    用二项式定理可变为 \((1-1)^{k-j}=0^{k-j}\)

    \(k=j\)\(0^{k-j}=1\),其他情况下 \(0^{k-j}=0\)

    \(\sum\limits_{i=0}^{k-j}\dbinom{k-j}{i}(-1)^{i}=[j=k]\)

    于是我们只用保留 \(j=k\) 的项即可,即 \(RHS=\sum\limits_{j=0}^kb_j\dbinom{k}{j}\times[j=k]=b_k\)

    大功告成。

    二项式反演还有一个兄弟,那就是 \(a_k=\sum\limits_{i=0}^k\dbinom{k}{i}b_i\leftrightarrow b_k=\sum\limits_{i=0}^k(-1)^{k-i}\dbinom{k}{i}a_i\)

    二项式反演一般也可以从容斥角度理解。

    35. CF997C Sky Full of Stars

    考虑设 \(F_{i,j}\) 为钦定某 \(i\) 行和某 \(j\) 列必须涂上同一种颜色,剩余的随便涂的方案数。(注意:题解区不少题解对这里 \(F_{i,j}\) 的解释有误,\(F_{i,j}\) 并不是所谓的至少 \(i\)\(j\) 列被涂上同一种颜色的方案数,因为有重复计算)

    再设 \(G_{i,j}\) 为钦定某 \(j\) 列必须涂上同一种颜色,并且恰好 \(i\) 行涂上了同一种颜色的方案数。

    再设 \(H_{i,j}\) 为恰好 \(i\)\(j\) 列被涂上同一种颜色的方案数

    考虑 \(F_{i,j}\)\(G_{k,j}\) 的关系,假设 \(i=3,k=4\) 并且有 \(a,b,c,d\) 四行被涂上了同一种颜色,那么我们来看看这个 \(G_{k,j}\) 会对 \(F_{i,j}\) 产生多少贡献。

    那么我们钦定 \(a,b,c\) 三行、\(a,b,d\) 三行、\(a,c,d\) 三行、\(b,c,d\) 三行必须被涂上同一种颜色的时候都会对 \(F_{i,j}\) 产生 \(G_{k,j}\) 的贡献,也就是说 \(G_{k,j}\) 会对 \(F_{i,j}\) 产生 \(\dbinom{k}{i}\) 的贡献。

    也就是说 \(F_{i,j}=\sum\limits_{k=i}^nG_{k,j}\times\dbinom{k}{i}\)

    套用二项式反演的公式可得 \(G_{i,j}=\sum\limits_{k=i}^nF_{k,j}\times\dbinom{k}{i}\times(-1)^{k-i}\)

    同理可得 \(H_{i,j}=\sum\limits_{l=j}^nG_{i,l}\times\dbinom{l}{j}\times(-1)^{l-j}=\sum\limits_{k=i}^n\sum\limits_{l=j}^nF_{k,l}\times\dbinom{k}{i}\dbinom{l}{j}\times(-1)^{k+l-i-j}\)

    而最终的答案为 \(3^{n^2}-H_{0,0}\)

    故我们只需求出 \(H_{0,0}\) 即可。

    \(H_{0,0}=\sum\limits_{i=0}^n\sum\limits_{j=0}^nF_{i,j}\times (-1)^{i+j}\)

    考虑 \(F_{i,j}\) 是什么东西:

    • \(i=0\),那么选择 \(j\) 列的方案数为 \(\dbinom{n}{j}\),为这 \(j\) 列每列找一种颜色的方案数为 \(3^j\),剩下 \(n(n-j)\) 个格子随便填的方案数为 \(3^{n(n-j)}\),故最终 \(F_{i,j}=\dbinom{n}{j}\times 3^{n(n-j)+j}\)
    • \(j=0\),同理可得 \(F_{i,j}=\dbinom{n}{j}\times 3^{n(n-i)+i}\)
    • \(i\neq 0\)\(j\neq 0\),那么选择 \(i\) 行的方案数为 \(\dbinom{n}{i}\),选择 \(j\) 列的方案数为 \(\dbinom{n}{j}\),对这 \(i\) 行和 \(j\) 列选一种颜色的方案数为 \(3\),剩下 \((n-i)(n-j)\) 个格子随便填的方案数为 \(3^{(n-i)(n-j)}\)。故最终 \(F_{i,j}=3^{(n-i)(n-j)+1}\times\dbinom{n}{i}\dbinom{n}{j}\)

    最后考虑怎样计算 \(H_{0,0}\),对于 \(i=0\)\(j=0\) 的部分 \(\mathcal O(n)\) 一遍显然是没问题的。关键是 \(i\neq 0\)\(j\neq 0\) 的部分。即 \(\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1}3^{ij+1}\times\dbinom{n}{i}\dbinom{n}{j}\times (-1)^{i+j}\)

    把含 \(i\) 的部分提到外面来可得 \(3\times\sum\limits_{i=0}^{n-1}(-1)^i\dbinom{n}{i}\times\sum\limits_{j=0}^{n-1}3^{ij}\times\dbinom{n}{j}\times (-1)^{j}\)

    注意到 \(3^{ij}\times (-1)^j=(-3^i)^j\),故原式 \(=3\times\sum\limits_{i=0}^{n-1}(-1)^i\dbinom{n}{i}\times\sum\limits_{j=0}^{n-1}(-3^{i})^j\times\dbinom{n}{j}\)

    后面的 \(\sum\) 一脸可以二项式定理的样子,如果补上一个 \(1^{n-j}\) 就更明显了:\(3\times\sum\limits_{i=0}^{n-1}(-1)^i\dbinom{n}{i}\times\sum\limits_{j=0}^{n-1}(-3^{i})^j\times\dbinom{n}{j}\times 1^{n-j}\)

    这里有一个坑点,后面的 \(\sum\) 是枚举到 \(n-1\) 的,而我们二项式定理要枚举到 \(n\),故原式 \(=3\times\sum\limits_{i=0}^{n-1}(-1)^i\dbinom{n}{i}\times[\sum\limits_{j=0}^{n}(-3^{i})^j\times\dbinom{n}{j}\times 1^{n-j}-(-3^i)^n]\)

    这样就可以放心大胆地二项式定理了:\(=3\times\sum\limits_{i=0}^{n-1}(-1)^i\dbinom{n}{i}\times[(1-3^i)^n-(-3^i)^n]\)

    这样就可以在 \(\mathcal O(n\log n)\) 的时间内计算出 \(H_{0,0}\)

    生成函数

    我专门为此写了篇 blog

    例题:

    36. P5219 无聊的水题 I

    首先考虑差分,将“度数最大的点的度数为 \(m\) 的方案数”,转化为“度数最大的点的度数不超过 \(m\) 的方案数”减去“度数最大的点的度数不超过 \(m-1\) 的方案数”。

    问题于是转化为怎样求度数最大的点的度数不超过 \(m\) 的方案数。考虑有个东西叫做 Prufer 序列,它是一个长度为 \(n-2\) 的序列,序列中每个数都在 \([1,n]\) 范围内,一个序列与一棵带点标号的无根树形成双射关系。其中 \(i\) 在 prufer 序列中出现次数就等于 \(i\) 在原无根树上的出现次数。于是原题转化为:求给一个长度为 \(n-2\) 的序列填上 \(n\) 个数,且每一个数出现次数最大值为 \(m-1\) 次的方案数。

    生成函数的题,一般都是先搞出一个朴素的 \(dp\) 状态并以此为突破口用生成函数来优化。这题我们也可以设 \(dp_{i,j}\) 表示填了 \(1\)\(i\) 中的数,填的数的个数为 \(j\) 的方案数。

    于是我们可以得到:\(dp_{i,j}=\sum\limits_{k=0}^{m-1}dp_{i-1,j-k}\dbinom{j}{k}\),最终要求的答案即为 \(dp_{n,n-2}\)

    这……不就二项式卷积吗?根据 EGF 的性质 \(dp_i\) 的 EGF 应当为 \(dp_{i-1}\) 的 EGF 与序列 \(a_i=[i<m]\) 的 EGF 的卷积。

    \(dp_0\) 的 EGF 为 \(1\),序列 \(a_i=[i<m]\) 的 EGF 为 \(F(x)=\sum\limits_{i=0}^{m-1}\dfrac{x^i}{i!}\)

    故求一下 \(F^{n}(x)\) 就可以得到 \(dp_n\) 的 EGF 了。(其实熟练的话根本不用什么 \(dp\),直接一遍就能推到这一步了)

    最终别忘了乘以 \((n-2)!\)

    37. P5339 [TJOI2019]唱、跳、rap和篮球

    cxk hopping

    我们考虑先钦定 \(i\) 个位置放上“鸡你太美”,其它随便填,设其方案数为 \(f(i)\)

    但这个 \(f(i)\) 显然不是恰好有 \(i\) 个“鸡你太美”的排列数——甚至不是至少 \(i\) 个“鸡你太美”的排列数。

    我们再设 \(g(i)\) 为恰好 \(i\) 个“鸡你太美”的排列数。

    我们考虑 \(g(j)\) 会对 \(f(i)\) 产生多少的贡献的贡献,显然对于这 \(g(j)\) 个不同的排列,从 \(j\) 个“鸡你太美”中任意钦定 \(i\) 个都会对 \(f(i)\) 产生 \(1\) 的贡献,故 \(f(i)=\sum\limits_{j=i}g(j)\times\dbinom{j}{i}\)

    又到了喜闻乐见的二项式反演的时间了

    这个并不是常见的二项式反演的形式,但它也可以进行二项式反演,反演一下即可得到 \(g(i)=\sum\limits_{j=i}(-1)^{j-i}\dbinom{j}{i}f(j)\)

    最后我们要求的答案为 \(g(0)\),即 \(\sum\limits_{j=0}(-1)^jf(j)\)

    接下来我们的任务就是求出 \(f(i)\),考虑现在 \(n\) 个位置上放好 \(i\) 个“鸡你太美”的方案数,如果我们把每个”鸡你太美“看作一个人的话,那么相当于在 \(n-3i\) 个位置上选择 \(i\) 个位置留给”鸡你太美“,方案数为 \(\dbinom{n-3i}{i}\)。最后考虑填好其他人的方案数。那我们相当于是在 \(n-4i\) 个位置上选择不超过 \(a-i\) 个”唱“,不超过 \(b-i\) 个“跳”,不超过 \(c-i\) 个”rap“,不超过 \(d-i\) 个”篮球“并排成一列的方案数。

    看到”排成一列“当然想到 EGF 咯。设 \(F1(x)=\sum\limits_{i=0}^{a-i}\dfrac{x^i}{i!},F2(x)=\sum\limits_{i=0}^{b-i}\dfrac{x^i}{i!},F3(x)=\sum\limits_{i=0}^{c-i}\dfrac{x^i}{i!},F4(x)=\sum\limits_{i=0}^{d-i}\dfrac{x^i}{i!}\),那么显然最终答案的 EGF 为 \(F1\times F2\times F3\times F4\),多项式卷积合并即可,别忘了最终乘上 \((n-4i)!\),时间复杂度 \(n^2\log n\),常熟较大,跑得比较慢。

    注意到本题的卷积比较特殊。考虑从大到小倒着枚举 \(j\),那么每次相当于是在 \(F1(x),F2(x),F3(x),F4(x)\) 后面各添上一项。记 \(G1(x)=F1(x)F2(x),G2(x)=F3(x)F4(x)\),那么我们每次都可以在 \(\mathcal O(n)\) 的时间内更新 \(G1(x),G2(x)\)。并且最终我们要求的只是 \(G1(x)G2(x)\)\(x^{n-3i}\) 项前面的系数,并不用把整个卷积都求出来,所以我们可以再次 \(\mathcal O(n)\) 扫一遍求得。时间复杂度降到了 \(\mathcal O(n^2)\)

    似乎这么随随便便一写就抢到了除了 EI 之外的最优解?EI 给出了一个 \(n^{1.5}\) 的神仙解法。storz EI yyds %%%%。

    38. P5748 集合划分计数

    解法 \(1\) 在我的 生成函数 blog 中提到过,\(B_n\) 的指数型生成函数就是 \(e^{e^x-1}\),多项式 exp 一遍即可,时间复杂度线对,这里就不赘述了。

    解法 \(2\):本题也可以用分治 NTT 来解决。

    首先有一个非常基本的 \(dp\) 转移方程,那就是 \(B_n=\sum\limits_{i=1}^nB_{n-i}\times\dbinom{n-1}{i-1}\),枚举 \(1\) 所在集合的大小,然后组合数转移一下即可。

    按照套路打开组合数可得 \(B_n=\sum\limits_{i=1}^nB_{n-i}\times\dfrac{(n-1)!}{(i-1)!(n-i)!}\)

    整理可得 \(\dfrac{B_n}{(n-1)!}=\sum\limits_{i=1}^n\dfrac{1}{(i-1)!}\times\dfrac{B_{n-i}}{(n-i)!}\)

    \(F_i=\dfrac{1}{(i-1)!},G_i=\dfrac{B_i}{i!}\),那么显然 \(\dfrac{B_n}{(n-1)!}=[x^n]FG\)

    之前没有系统地讲过分治 NTT 的使用条件,这里简单讲一下:如果 \(f_i\) 可以写成两个多项式 \(A(x)B(x)\) 的形式,并且 \(A\) 为已知多项式,\(B\) 只与 \(x\) 有关,那么就可以分治 NTT。上式显然满足条件。

    于是直接上个分治 NTT 即可,时间复杂度线性二次对数。

    那么问题就来了,为什么我的 1log 跑不过 2log 呢?

    39. P4491 [HAOI2018] 染色

    老套路,还是设 \(f_i\) 为钦定 \(i\) 种颜色必须恰好有 \(s\) 个,剩下 \(n-is\) 个格子都不能染这 \(i\) 种颜色的方案数,则 \(f_i=\dbinom{m}{i}\times\dbinom{n}{is}\times\dfrac{(is)!}{(s!)^i}\times(m-i)^{n-is}=\dbinom{m}{i}\times\dfrac{n!}{(n-is)!(s!)^i}\times(m-i)^{n-is}\)

    再设 \(g_i\) 为出现次数 \(s\) 的颜色恰好有 \(i\) 个的方案数。

    按照 [TJOI2019]唱、跳、rap和篮球 的结论有 \(f_i=\sum\limits_{j=i}\dbinom{j}{i}g_j\)

    反演一下可得 \(g_i=\sum\limits_{j=i}(-1)^{j-i}\dbinom{j}{i}f_j\)

    按照套路把组合数拆开可得 \(g_i=\sum\limits_{j=i}(-1)^{j-i}\times\dfrac{j!}{i!(j-i)!}\times f_j\)

    如果设 \(a_j=f_i\times i!,b_i=(-1)^i\times\dfrac{1}{i!}\)

    那么 \(g_i=\sum\limits_{j=i}a_jb_{j-i}=\sum\limits_{x-y=i}a_xb_y\)

    又是喜闻乐见的差卷积,把 \(a\) 数组翻转一下求一遍卷积就行了。

    40. P5162 WD与积木

    其实和集合划分计数差不多罢。

    首先是怎样计算选法,由于积木有标号,故需用 EGF 解决。

    显然每一层的生成函数为 \(F(x)=\sum\limits_{i=1}^{\infty}\dfrac{x^i}{i!}=e^x-1\)

    枚举层数,因为最终每一层的积木有序,最终选法的 EGF \(G(x)=1+F+F^2+F^3+\dots=\dfrac{1}{1-F}\)

    接下来求所有方案的层数总和,还是枚举层数,层数之和的 EGF \(H(x)=\sum\limits_{i\geq 1}iF^i=\dfrac{F}{(1-F)^2}\)

    多项式求逆一遍就行了。

    拉格朗日插值

    41. P4781 【模板】拉格朗日插值

    众所周知,给定平面上 \(n+1\) 个点 \((x_1,y_1),(x_2,y_2),\dots,(x_{n+1},y_{n+1})\),就可以唯一确定一个 \(n\) 次多项式 \(F(x)\)

    那么这个多项式该怎样求呢?这就要用到拉格朗日插值法了。

    一个显然的想法是对每个 \((x_i,y_i)\) 列出一个 \(n+1\) 元方程组然后暴力消元求解,但这样复杂度高达 \(n^3\),显然不能被我们接受。

    考虑设 \(l_i(x)=\prod\limits_{1\leq j\leq n+1\&j\neq i}\dfrac{x-x_j}{x_i-x_j}\)

    那么这个式子有什么性质呢?

    考虑将 \(x_i\) 代入 \(l_i(x)\) 可得 \(l_i(x_i)=\prod\limits_{1\leq j\leq n+1\&j\neq i}\dfrac{x_i-x_j}{x_i-x_j}=1\)

    再将另外某个 \(x_j(i\neq j)\) 代入 \(l_i(x)\),其中必有一项 \(\dfrac{x_j-x_j}{x_i-x_j}=0\),故 \(l_i(x_j)=0\)

    也就是说对于 \(j=i\)\(l_i(x_j)=1\);对于 \(j\neq i\)\(l_i(x_j)=0\)

    然后我们就有 \(F(x)=\sum\limits_{i=1}^{n+1}y_il_i(x)\)

    为什么?考虑将 \(x_i\) 代入 \(F(x)\),根据之前的推论,只有 \(y_il_i(x)\) 一项值非零,为 \(y_i\);其余每项值都是 \(0\);故 \(F(x_i)=y_i\)。而 \(F(x)\) 的展开式中次数最高的项为 \(x^n\),故 \(F(x)\) 就是经过这 \(n+1\) 个点的多项式。

    对于本题来说,我们要求 \(F(k)\),故将 \(k=x\) 代入原式中,暴力一代就行了。时间复杂度 \(\mathcal O(n^2)\)

    那如果我们真的要知道 \(F(x)\) 的展开式怎么办呢?考虑暴力展开 \(l_i(x)\),首先分母上那坨东西显然是可以 \(\mathcal O(n)\) 算出来的。关键是分子上那坨东西,暴力展开是 \(\mathcal O(n^2)\) 的,显然不能被接受。

    考虑预处理出 \(G(x)=\prod\limits_{i=1}^{n+1}(x-x_i)\)

    那么 \(l_i(x)\) 分子上的东西 \(\prod\limits_{1\leq j\leq n+1\&j\neq i}x-x_j\) 就等于 \(\dfrac{G(x)}{x-x_i}\)

    \(\mathcal O(n^2)\) 地预处理出 \(G(x)\),然后用类似于多项式除法的套路 \(\mathcal O(n)\) 地求出 \(\dfrac{G(x)}{x-x_i}\),把它们累加起来就 ok 了。

    42. CF622F The Sum of the k-th Powers

    根据老祖宗留下来的东西,\(\sum\limits_{i=1}^ni^k\) 是一个关于 \(n\)\(k+1\) 次多项式。

    故可以用插值来解决这个问题。任意选择 \(k+2\) 个不同的 \(n\) 并代入,一遍插值求出答案。

    但是你可能会问:插值不是 \(k^2\) 的吗?这题 \(k\) 高达 \(10^6\) 呢。。。

    这就启发我们要选择合适的 \(k+2\)\(n\) 了,我们考虑选择 \(0,1,2,3,\dots,k+1\) 作为这 \(k+2\)\(n\) 并代入。

    显然这 \(k+2\) 个点值可以通过一遍前缀和求出。

    关键是怎样快速求出 \(l_i(n)=\prod\limits_{0\leq j\leq k+1\&j\neq i}\dfrac{n-j}{i-j}\)

    我们考虑将其拆成两个部分 \(\prod\limits_{0\leq j<i}\dfrac{n-j}{i-j}\)\(\prod\limits_{i<j\leq k+1}\dfrac{n-j}{i-j}\)

    分子上的东西可以通过维护 \(pre_j=\prod\limits_{0\leq j<i}n-j,suf_j=\prod\limits_{i<j\leq k+1}n-j\) 计算得到。

    左边分母上的东西其实就是 \(i!\),右边分母上的东西为 \(\prod\limits_{i<j\leq k+1}i-j=\prod\limits_{i<j\leq k+1}-(j-i)=(-1)^{k+1-i}(k+1-i)!\),故分母上的东西可以通过预处理阶乘及阶乘的逆元求出。

    时间复杂度线性对数。

    43. P4593 [TJOI2018]教科书般的亵渎

    我们先从最简单的情况开始,若 \(m=0\),显然一次操作就能搞定,答案为 \(\sum\limits_{i=1}^ni\)

    \(m=1\),需要两次操作才能搞定,第一次操作对所有怪物都能造成伤害,代价为 \((\sum\limits_{i=1}^ni^2)-a_1^2\),第二次操作后血量小于 \(a_1\) 的怪都死了,只剩下血量大于 \(a_1\) 的怪物,并且此时它们的血量都减去了 \(a_1\),故第二次的代价为 \(\sum\limits_{i=1}^{n-a_1}i^2\),把二者加起来即可。

    \(m=2,3,\dots\) 也同理,观察一下即可发现操作次数为 \(m+1\),故最终答案为 \(\sum\limits_{i=0}^m[(\sum\limits_{j=1}^{n-a_i}j^{m+1})-\sum\limits_{j=i+1}^m(a_j-a_i)^{m+1}]\)

    发现瓶颈在于 \(\sum\limits_{j=1}^{n-a_i}j^{m+1}\),按照上一题的套路随便插个值即可,时间复杂度 \(\mathcal O(m^2\log m)\)

    下降幂与斯特林数

    下降幂

    首先考虑最经典的微分算子 \(Df(x)=\lim\limits_{\Delta\to 0}\dfrac{f(x+\Delta x)-f(x)}{\Delta x}\),一般适用于连续型函数。

    但是有时候我们遇到的函数是离散的,这时微分算子就不管用了,我们重新定义一个差分算子 \(\Delta f(x)=f(x+1)-f(x)\)

    众所周知在微积分中有一个非常重要的式子叫做 \(D(x^a)=ax^{a-1}\)

    我们希望这个性质同样适用于差分算子,可惜 \(\Delta(x^a)=(x+1)^a-x^a=\sum\limits_{i=0}^a\dbinom{a}{i}x^i-x^a=\sum\limits_{i=0}^{a-1}\dbinom{a}{i}x^i\),并没有什么很好的性质。

    幸运的是,我们能找到另一种幂,使其满足类似的性质。

    定义下降幂 \(x^{\underline{a}}=x(x-1)(x-2)\dots(x-a+2)(x-a+1)=\dfrac{x!}{(x-a)!}\)

    考虑将差分算子应用于下降幂可得

    \[\begin{aligned}\Delta(x^{\underline{a}})&=(x+1)^{\underline{a}}-x^{\underline{a}}\\&=(x+1)x(x-1)\dots(x-a+2)-x(x-1)(x-2)\dots(x-a+1)\\&=(x+1-(x-a+1))x(x-1)(x-2)\dots(x-a+2)\\&=ax^{\underline{a-1}}\end{aligned} \]

    我们进一步考虑对下降幂求和,即有限积分,类比微积分中 \(\int_{0}^xx^k=\dfrac{x^{k+1}}{k+1}\),可得 \(\sum\limits_{i=0}^{n-}i^{\underline{k}}=\dfrac{n^{\underline{k+1}}}{k+1}\)

    但注意,在微积分中,\(k=-1\) 时有特例 \(\int_{0}^xx^{-1}=\ln(x)\),在对下降幂求前缀和时也需特判 \(k=-1\)\(\sum\limits_{i=1}^n\dfrac{1}{i}\) 的情况,即调和级数,为 \(\ln(x)\) 的离散近似。

    还有一个很神奇的定理就是下降幂也符合二项式定理,即 \((x+y)^{\underline{m}}=\sum\limits_{i=0}^m\dbinom{m}{i}x^{\underline{i}}y^{\underline{m-i}}\)

    证明:考虑数学归纳法,\(m=1\)\(LHS=x+y=RHS\)

    假设命题对 \(m=n\) 时候成立,下证命题对 \(m=n+1\) 成立。

    \[\begin{aligned}(x+y)^{\underline{m+1}}&=(x+y)^{\underline{m}}·(x+y-m)\\&=(\sum\limits_{i=0}^m\dbinom{m}{i}x^{\underline{i}}y^{\underline{m-i}})(x+y-m)\\&=\sum\limits_{i=0}^m\dbinom{m}{i}x^{\underline{i}}y^{\underline{m-i}}((x-i)+(y-(m-i)))\\&=\sum\limits_{i=0}^m\dbinom{m}{i}x^{\underline{i}}y^{\underline{m-i}}((x-i)+(y-(m-i)))\\&=\sum\limits_{i=0}^m\dbinom{m}{i}x^{\underline{i+1}}y^{\underline{m-i}}+\dbinom{m}{i}x^{\underline{i}}y^{\underline{m-i+1}}\\&=\sum\limits_{i=0}^{m+1}(\dbinom{m}{i-1}+\dbinom{m}{i})x^{\underline{i}}y^{\underline{m+1-i}}\\&=\sum\limits_{i=0}^{m+1}\dbinom{m+1}{i}x^{\underline{i}}y^{\underline{m+1-i}}\end{aligned} \]

    故命题对 \(m=n+1\) 成立。故命题成立。

    在 OI 中还有一类应用不是太广泛的上升幂,它的定义为 \(x^{\bar{a}}=x(x+1)(x+2)\dots(x+a-1)=\dfrac{(x+a-1)!}{(x-1)!}\),与下降幂类似,上升幂也有类似的性质。

    显然,\(x^{\underline{a}},x^{\bar{a}}\) 均为关于 \(x\)\(a\) 次多项式,至于怎样将其展开,将会在求解第一类斯特林数时讨论。

    第二类斯特林数

    不要问我为什么先讲第二类斯特林数

    定义第二类斯特林数 \(\begin{Bmatrix}n\\m\end{Bmatrix}\) 为将 \(n\) 个不同的球放入 \(m\) 个相同的盒子的方案数。

    首先第二类斯特林数有一个显然的递推公式 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\times \begin{Bmatrix}n-1\\m\end{Bmatrix}\)

    解释:考虑最后一个球的放法,要么单独成盒,即 \(\begin{Bmatrix}n-1\\m-1\end{Bmatrix}\),要么放入某个装有球的盒子中,即 \(m\times\begin{Bmatrix}n-1\\m\end{Bmatrix}\)

    一些第二类斯特林数的恒等式:

    1. \(m^n=\sum\limits_{i=0}^m\begin{Bmatrix}n\\i\end{Bmatrix}\times i!\times\dbinom{m}{i}\)

      考虑组合意义,借鉴 MO 中算两次的思想。左边 \(m^n\) 表示将 \(n\) 个球放入 \(m\) 个不同盒子的方案数。右边枚举有多少个盒子非空,\(\dbinom{m}{i}\) 相当于从 \(m\) 个盒子中选出这 \(i\) 个非空的盒子。\(\begin{Bmatrix}n\\i\end{Bmatrix}\) 表示将 \(n\) 个球放入这 \(i\) 个盒子中,由于盒子不同,所以最后还需乘上一个 \(i!\)

      不难发现两种算法是等价的,故 \(m^n=\sum\limits_{i=0}^m\begin{Bmatrix}n\\i\end{Bmatrix}\times i!\times\dbinom{m}{i}\)

    2. \(x^n=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\times x^{\underline{i}}\)

      其实就是由上一个式子衍生而来的,只不过把后面的 \(i!\times\dbinom{x}{i}\) 替换为了 \(x^{\underline{i}}\) 而已。

      这个式子可以实现用下降幂来表示普通幂,在第一类斯特林数中我们还将学到一个用普通幂来表示下降幂的式子

    3. \(\begin{Bmatrix}n\\k\end{Bmatrix}=\dfrac{1}{k!}\sum\limits_{i=0}^k(-1)^{k-i}\times i^n\times\dbinom{k}{i}\)

      考虑对一式进行二项式反演,记 \(a_i=i^n,b_i=i!\times\begin{Bmatrix}n\\i\end{Bmatrix}\),那么一式可写作 \(a_k=\sum\limits_{i=0}^k\dbinom{k}{i}\times b_i\),反演一下可得 \(b_k=\sum\limits_{i=0}^k(-1)^{k-i}\times\dbinom{k}{i}\times a_i\),故 \(\begin{Bmatrix}n\\k\end{Bmatrix}=\dfrac{1}{k!}\sum\limits_{i=0}^k(-1)^{k-i}\times i^n\times\dbinom{k}{i}\)

      该式为第一类斯特林数的通项公式,可用来求一行第二类斯特林数的 OGF

    4. \(\sum\limits_{n=k}\begin{Bmatrix}n\\k\end{Bmatrix}\times\dfrac{x^i}{n!}=\dfrac{1}{k!}(e^x-1)^k\)

      考虑在学 EGF 用到的“生成集合”的思想,我们考虑把一种球的方法看作“集合的集合”,一个盒子内球的方法看作单个集合。那么单个集合的 EGF 就是 \(e^x-1\)(集合不能为空),故 \(k\) 个盒子放法的 EGF 就是 \((e^x-1)^k\),而由于盒子与盒子之间无区别,故还需乘上 \(\dfrac{1}{k!}\)

      该式可用来求一列第二类斯特林数的 EGF

    5. \(\sum\limits_{i=0}^ni^k=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\times j!\times\dbinom{n+1}{j+1}\)

      其实也是一式的推广罢……

      \[\begin{aligned}LHS&=\sum\limits_{i=0}^ni^k\\&=\sum\limits_{i=0}^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\times j!\times\dbinom{i}{j}\\&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\times j!\times(\sum\limits_{i=0}^n\dbinom{i}{j})\\&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\times j!\times\dbinom{n+1}{j+1}\\&=RHS\end{aligned} \]

    第一类斯特林数

    定义第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\) 为将 \(n\) 个元素形成 \(m\) 个圆排列的方案数。

    第一类斯特林数还是有一个显然的递推公式 \(\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\times \begin{bmatrix}n-1\\m\end{bmatrix}\)

    解释:考虑最后一个元素的方法,要么单独成一个圆排列,即 \(\begin{bmatrix}n-1\\m-1\end{bmatrix}\),要么插入某个已有的圆排列中,有 \(n-1\) 种插法,即 \((n-1)\times\begin{bmatrix}n-1\\m\end{bmatrix}\)

    还是给出一些第一类斯特林数的恒等式:

    1. \(\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}=n!\)

      这个就比较 sb 了吧……对于每一个 \(1\)\(n\) 的排列,显然与一个由 \(n\) 个元素组成的置换一一对应,所以加起来就不重不漏地统计了全部 \(n!\) 个置换。

    2. \(x^{\bar{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i\)

      这个就有亿点点神仙了(

      考虑使用数学归纳法,\(n=1\) 时候命题显然成立。

      假设命题对 \(n=k\) 时成立,下证命题对 \(n=k+1\) 时成立。

      由归纳假设有 \(x^{\bar{k}}=\sum\limits_{i=0}^k\begin{bmatrix}k\\i\end{bmatrix}x^i\)

      \[\begin{aligned}\therefore x^{\bar{k+1}}&=x^{\bar{k}}\times(x+k)\\&=(\sum\limits_{i=0}^k\begin{bmatrix}k\\i\end{bmatrix}x^i)\times(x+k)\\&=\sum\limits_{i=0}^k\begin{bmatrix}k\\i\end{bmatrix}\times x^{i+1}+\sum\limits_{i=0}^k\begin{bmatrix}k\\i\end{bmatrix}\times k\times x^{i}\\&=\sum\limits_{i=0}^{k+1}(\begin{bmatrix}k\\i-1\end{bmatrix}+k\times\begin{bmatrix}k\\i\end{bmatrix})\times x^i\\&=\sum\limits_{i=0}^{k+1}\begin{bmatrix}k+1\\i\end{bmatrix}x^i\end{aligned} \]

      故命题对 \(n=k+1\) 成立;故原命题成立。

      该式可用来求一行第一类斯特林数的 OGF

    3. \(x^{\underline{n}}=\sum\limits_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}x^i\)

      证明和二式大差不差,可使用数归证明,这里就不再赘述了。

      该式可实现用普通幂来表示下降幂

    4. \(\sum\limits_{n=k}\begin{bmatrix}n\\k\end{bmatrix}\times\dfrac{x^i}{n!}=\dfrac{1}{k!}\times (\ln(\dfrac{1}{1-x})-1)^k\)

      还是考虑在学 EGF 用到的“生成集合”的思想,我们把一个由若干个圆排列组成的置换看作“集合的集合”,一个圆排列看作单个集合。我们知道,大小为 \(n\) 的圆排列的个数为 \(\dfrac{n!}{n}=(n-1)!\),故单个集合的 EGF 就是 \(\sum\limits_{i=1}^{\infty}(i-1)!\times\dfrac{x^i}{i!}=\sum\limits_{i=1}^{\infty}\dfrac{x^i}{i}=\ln(\dfrac{1}{1-x})-1\),故 \(k\) 个圆排列的 EGF 就是 \((\ln(\dfrac{1}{1-x})-1)^k\),而由于圆排列之间没有差别,故需乘个 \(\dfrac{1}{k!}\)

      该式可用来求一列第一类斯特林数的 EGF

    最后给出普通幂与阶乘幂转化的全套公式:

    • \(x^n=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline{i}}\)
    • \(x^n=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}(-1)^{n-i}x^{\bar{i}}\)
    • \(x^{\bar{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i\)
    • \(x^{\underline{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}x^i\)

    共四个公式,其中下降幂与普通幂转化的两个公式较常用。

    至于什么时候用第一类斯特林数,什么时候用第二类斯特林数,什么时候加 \((-1)^{n-i}\),什么时候不加,你只需记住以下几点:

    • 普通幂表示阶乘幂时用第一类,阶乘幂表示普通幂时用第二类。
    • 大幂(\(x^{\bar{n}}>x^n>x^{\underline{n}}\))表示小幂时加 \((-1)^{n-i}\),小幂表示大幂时不加。

    斯特林反演

    大概就是 \(a_n=\sum\limits_{k=0}^n\begin{Bmatrix}n\\k\end{Bmatrix}b_k\leftrightarrow b_n=\sum\limits_{k=0}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}a_k\)

    证明:首先先证明 \(\sum\limits_{i=m}^n(-1)^{n-i}\begin{Bmatrix}n\\i\end{Bmatrix}\begin{bmatrix}i\\m\end{bmatrix}=[n=m]\)(反转公式)

    \[\begin{aligned}x^n&=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline{i}}\\&=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\sum\limits_{j=0}^i\begin{bmatrix}i\\j\end{bmatrix}(-1)^{i-j}x^j\\&=\sum\limits_{j=0}^nx^j\sum\limits_{i=j}^n\begin{Bmatrix}n\\i\end{Bmatrix}\begin{bmatrix}i\\j\end{bmatrix}(-1)^{i-j}\end{aligned} \]

    而左边只有 \(x^n\) 前有系数 \(1\),这意味着 \(x^0,x^1,\dots,x^{n-1}\) 前的系数均为 \(0\),故 \(\sum\limits_{i=m}^n(-1)^{n-i}\begin{Bmatrix}n\\i\end{Bmatrix}\begin{bmatrix}i\\m\end{bmatrix}=[n=m]\)

    于是我们有:

    \[\begin{aligned}\sum\limits_{k=0}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}a_k&=\sum\limits_{k=0}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}\sum\limits_{i=0}^k\begin{Bmatrix}k\\i\end{Bmatrix}b_i\\&=\sum\limits_{i=0}^nb_i\sum\limits_{k=i}^n\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\i\end{Bmatrix}(-1)^{n-k}\\&=\sum\limits_{i=0}^nb_i\times[i=n]\\&=b_n\end{aligned} \]

    大功告成。

    同样它也有一个姊妹形式 \(a_n=\sum\limits_{k=0}^n\begin{bmatrix}n\\k\end{bmatrix}b_k\leftrightarrow b_n=\sum\limits_{k=0}^n(-1)^{n-k}\begin{Bmatrix}n\\k\end{Bmatrix}a_k\)

    证明过程类似。

    最后再给出一些第一类斯特林数与第二类斯特林数结合的公式,全部出自《具体数学》,感觉应用不是太广泛,大概看看吧:

    • \(\begin{bmatrix}n+1\\m+1\end{bmatrix}=\sum\limits_{k=m}^n\begin{bmatrix}n\\k\end{bmatrix}\dbinom{k}{m}\)
    • \(\begin{Bmatrix}n+1\\m+1\end{Bmatrix}=\sum\limits_{k=m}^n\dbinom{n}{k}\begin{Bmatrix}k\\m\end{Bmatrix}\)(提示:考虑组合意义,元素 \(n+1\) 与多少个元素被分在同一组)
    • \(\dbinom{n}{m}=\sum\limits_{k=m}^n\begin{Bmatrix}n+1\\k+1\end{Bmatrix}\begin{bmatrix}k\\m\end{bmatrix}(-1)^{m-k}\)

    例题:

    44. P5395 第二类斯特林数·行

    套用第二类斯特林数的通项公式 \(\begin{Bmatrix}n\\k\end{Bmatrix}=\dfrac{1}{k!}\sum\limits_{i=0}^k(-1)^{k-i}\times i^n\times\dbinom{k}{i}\),将组合数拆开并将带 \(i\) 和带 \(k-i\) 的分别合并可得 \(\begin{Bmatrix}n\\k\end{Bmatrix}=\sum\limits_{i=0}^k\dfrac{(-1)^{k-i}}{(k-i)!}\times\dfrac{i^n}{i!}\),令 \(a_i=\dfrac{i^n}{i},b_i=\dfrac{(-1)^i}{i!}\),对 \(a,b\) 求个卷积即可。

    45. P5396 第二类斯特林数·列

    套用一列第二类斯特林数的 EGF \(\sum\limits_{n=k}\begin{Bmatrix}n\\k\end{Bmatrix}\times\dfrac{x^i}{n!}=\dfrac{1}{k!}(e^x-1)^k\),倍增求一遍 \((e^x-1)^k\) 就行了。时间复杂度线性二次对数。当然有线对的 exp 多项式快速幂写法,不过由于 2log 的写法能过就不写 1log 的写法了。

    据说有 1log 的分治 NTT 做法?然鹅我太懒了就不学了。

    46. P5408 第一类斯特林数·行

    根据一行第一类斯特林数的 OGF \(x^{\bar{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i\) 可知问题等价于求 \(x^{\bar{n}}\) 的展开式。

    下面探讨怎样求 \(x^{\bar{n}}\),首先注意到 \(x^{\bar{n+1}}=x^{\bar{n}}\times(x+n)\),故可以在线性的时间内从 \(x^{\bar{n}}\) 转移到 \(x^{\bar{n+1}}\)

    \(x^{\bar{2n}}=x^{\bar{n}}\times (x+n)^{\bar{n}}\),如果我们记 \(f_n(x)=x^{\bar{n}}\),那么 \((x+n)^{\bar{n}}=f_n(x+n)\)\(x^{\bar{2n}}=f_n(x)f_n(x+n)\),故如果我们能快速对于已知多项式 \(f(x)\) 求出 \(f(x+n)\),那么我们就可以在较短时间内从 \(x^{\bar{n}}\) 转移到 \(x^{\bar{2n}}\),也就可以倍增解决此题了。

    我们考虑假设 \(f(x)\)\(n\) 次多项式,系数分别为 \(a_0,a_1,\dots,a_n\),下面将推导 \(f(x+c)\) 的值:

    \[\begin{aligned}f(x+c)&=\sum\limits_{i=0}^na_i(x+c)^i\\&=\sum\limits_{i=0}^na_i\sum\limits_{j=0}^ic^{i-j}\dbinom{i}{j}x^j\\&=\sum\limits_{j=0}^nx^j\sum\limits_{i=j}^na_ic^{i-j}\dbinom{i}{j}\\&=\sum\limits_{j=0}^nx^j\sum\limits_{i=j}^na_ic^{i-j}\times\dfrac{i!}{j!(i-j)!}\\&=\sum\limits_{j=0}^n\dfrac{x^j}{j!}\sum\limits_{i=j}^na_ii!\times\dfrac{c^{i-j}}{(i-j)!}\end{aligned} \]

    \(g_i=a_ii!,h_i=\dfrac{c^i}{i!}\),则 \(f(x+c)=\sum\limits_{j=0}^n\dfrac{x^j}{j!}\times\sum\limits_{x-y=j}g_xh_y\)。求个差卷积即可。

    根据主定理可知复杂度为线性对数。

    47. P5409 第一类斯特林数·列

    套用一列第一类斯特林数的 EGF \(\sum\limits_{n=k}\begin{bmatrix}n\\k\end{bmatrix}\times\dfrac{x^i}{n!}=\dfrac{1}{k!}\times (\ln(\dfrac{1}{1-x})-1)^k\),直接算一下就好了。

    那问题就来了,为什么 第二类斯特林数·列 2log 的做法就能过,而这题 2log 过不去呢/yiw

    那就只能 exp 求多项式快速幂了呗。。。这样一来又有一个问题,那就是 \(\ln(\dfrac{1}{1-x}-1)\) 的常数项为 \(0\),不能直接取 \(\ln\),不过容易发现 \(\dfrac{\ln(\dfrac{1}{1-x})-1}{x}\) 的常数项为 \(1\),可以直接取 \(\ln\),所以求一遍 \(\dfrac{\ln(\dfrac{1}{1-x})-1}{x}\)\(k\) 次幂,最后乘上个 \(x^k\) 即可。

    咋总感觉水了四篇题解呢?

    48. CF960G Bandit Blues

    首先,容易注意到,假设最大值所在的位置为 \(i\),那么 \(i\) 肯定既是前缀最大值又是后缀最大值,并且 \(i\) 之后不存在前缀最大值,\(i\) 之前不存在后缀最大值。不难发现前缀最大值和后缀最大值本质上是相同的,所以我们考虑设 \(dp_{i,j}\) 为在前 \(i\) 个位置中存在 \(j\) 个前缀最大值的方案数,那么易得状态转移方程式 \(dp_{i,j}=dp_{i-1,j-1}+(i-1)\times dp_{i-1,j}\)。最后枚举最大值所在位置 \(i\),那么答案即为 \(\sum\limits_{i=1}^n\dbinom{n-1}{i-1}\times dp_{i-1,a-1}\times dp_{n-i,b-1}\)

    容易发现 \(dp_{i,j}\) 其实就是第一类斯特林数,所以你套个第一类斯特林数·列的模板就完事了。

    当然题解区还有更优秀的做法,考虑上式的组合意义,相当于从 \(n-1\) 个数中选若干个数,并在这若干个数中形成 \(a-1\) 个圆排列,再从另外的数中形成 \(b-1\) 个圆排列,它等价于从 \(n-1\) 个数中形成 \(a+b-2\) 个圆排列,再选出 \(a-1\) 个圆排列,即 \(\begin{bmatrix}n-1\\a+b-2\end{bmatrix}\times\dbinom{a+b-2}{a-1}\),这样就省掉了枚举的环节了。

    49. CF961G Partitions

    不难发现这 \(n\) 个物品是对称的,所以这 \(n\) 个物品对答案的贡献也是相等的,所以我们不妨考虑固定住某个元素 \(a_r\),看它对答案产生了多少贡献。

    我们枚举 \(r\) 所在的集合大小 \(i\),并从剩余 \(n-1\) 个元素中选择 \(i-1\) 个与 \(a_r\) 分在同一个集合。那么剩余的工作相当于是将剩下 \(n-i\) 个元素划分到 \(k-1\) 个无序集合中,即第二类斯特林数 \(\begin{Bmatrix}n-i\\k-1\end{Bmatrix}\)

    \(ans=\sum\limits_{i=1}^ni\dbinom{n-1}{i-1}\begin{Bmatrix}n-i\\k-1\end{Bmatrix}\)

    下面就到了愉快地颓柿子的时间了:

    \[\begin{aligned}ans&=\sum\limits_{i=1}^ni\dbinom{n-1}{i-1}\begin{Bmatrix}n-i\\k-1\end{Bmatrix}\\&=\sum\limits_{i=1}^ni\dbinom{n-1}{i-1}\dfrac{1}{(k-1)!}\sum\limits_{j=0}^{k-1}j^{n-i}\dbinom{k-1}{j}(-1)^{k-1-j}\\&=\sum\limits_{i=1}^ni\dbinom{n-1}{i-1}\dfrac{1}{(k-1)!}\sum\limits_{j=0}^{k-1}j^{n-i}\dfrac{(k-1)!}{j!(k-1-j)!}(-1)^{k-1-j}\\&=\sum\limits_{j=0}^{k-1}\dfrac{(-1)^{k-1-j}}{j!(k-1-j)!}\times\sum\limits_{i=1}^ni\dbinom{n-1}{i-1}j^{n-i}\\&=\sum\limits_{j=0}^{k-1}\dfrac{(-1)^{k-1-j}}{j!(k-1-j)!}\times\sum\limits_{i=1}^n(1+i-1)\dbinom{n-1}{i-1}j^{n-i}\\&=\sum\limits_{j=0}^{k-1}\dfrac{(-1)^{k-1-j}}{j!(k-1-j)!}\times(\sum\limits_{i=1}^n\dbinom{n-1}{i-1}j^{n-i}+\sum\limits_{i=1}^n(i-1)\dbinom{n-1}{i-1}j^{n-i})\\&=\sum\limits_{j=0}^{k-1}\dfrac{(-1)^{k-1-j}}{j!(k-1-j)!}\times(\sum\limits_{i=1}^n\dbinom{n-1}{i-1}j^{n-i}1^{i-1}+\sum\limits_{i=1}^n(n-1)\dbinom{n-2}{i-2}j^{n-i}1^{i-2})\\&=\sum\limits_{j=0}^{k-1}\dfrac{(-1)^{k-1-j}}{j!(k-1-j)!}\times[(j+1)^{n-1}+(n-1)(j+1)^{n-2}]\end{aligned} \]

    大功告成。

    50. CF932E Team Work

    第二类斯特林数常用来对付解决自然数 \(k\) 次幂的问题。

    还是推式子,一般碰到自然数 \(k\) 次幂与组合数结合在一起的情况,二话不说,直接拆 \(k\) 次幂。

    \[\begin{aligned}ans&=\sum\limits_{i=1}^n\dbinom{n}{i}i^k\\&=\sum\limits_{i=1}^n\dbinom{n}{i}\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{i}{j}\\&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=0}^n\dbinom{n}{i}\dbinom{i}{j}\\&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=0}^n\dbinom{n}{j}\dbinom{n-j}{i-j}\\&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}\sum\limits_{i=0}^{n-j}\dbinom{n-j}{i}\\&=\sum\limits_{j=0}^n\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}2^{n-j}\end{aligned} \]

    据说还有 \(\mathcal O(k)\) 的做法?orzorz,不过不想学了(

    51. P6620 [省选联考 2020 A 卷] 组合数问题

    这题我竟然自己搞出来了!incredible!

    首先注意到普通幂与组合数不太搭,而我们学过的另一种幂……下降幂与组合数都是基于阶乘运算的,刚好天生一对。又观察到这题数据范围又很小,于是我们考虑暴力求解第二类斯特林数,用普通幂转下降幂的技巧 \(x^n=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline{i}}\) 将原多项式转化为下降幂多项式。

    于是设 \(f(x)=b_0x^{\underline{0}}+b_1x^{\underline{1}}+\dots+b_mx^{\underline{m}}\)

    那么:

    \[\begin{aligned}ans&=\sum\limits_{k=0}^nf(k)x^k\dbinom{n}{k}\\&=\sum\limits_{i=0}^m\sum\limits_{k=0}^nb_ik^{\underline{i}}x^k\dbinom{n}{k}\\&=\sum\limits_{i=0}^mb_i\sum\limits_{k=0}^n\dbinom{n}{k}\dbinom{k}{i}x^ki!\\&=\sum\limits_{i=0}^mb_ii!\sum\limits_{k=0}^n\dbinom{n}{i}\dbinom{n-i}{k-i}x^k\\&=\sum\limits_{i=0}^mb_ii!\dbinom{n}{i}\sum\limits_{k=0}^{n-i}\dbinom{n-i}{k}x^{i+k}\\&=\sum\limits_{i=0}^mb_ii!\dbinom{n}{i}x^i\sum\limits_{k=0}^{n-i}\dbinom{n-i}{k}x^{k}1^{n-i-k}\\&=\sum\limits_{i=0}^mb_ii!\dbinom{n}{i}x^i(1+x)^{n-i}\\&=\sum\limits_{i=0}^mb_in^{\underline{i}}x^i(1+x)^{n-i}\end{aligned} \]

    发现 \(\sum\) 里的东西都是可以一边枚举一边求得的,并且不用用到模 \(p\) 的逆元,于是这题就做完了。

    52. P4827 [国家集训队] Crash 的文明世界

    首先有一个 \(nk^2\) 的用二项式定理暴力计算 \(k\) 次方和 \(+\) 换根 dp 的做法,套路类似于 P6144 [USACO20FEB]Help Yourself P,可以拿到 50pts 的成绩,这里就不再赘述了。

    不难发现这个暴力的瓶颈在于 \(x^k\) 转移到 \((x+1)^k\)\(\mathcal O(k)\) 级别的,那么有没有什么东西支持 \(\mathcal O(1)\) 转移呢?

    很容易想到组合数的递推公式。

    那么有什么能将 \(k\) 次幂转化为组合数呢?

    很容易想到第二类斯特林数。

    开始推式子:

    \[\begin{aligned}ans_x&=\sum\limits_{i=1}^ndis(i,x)^k\\&=\sum\limits_{i=1}^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\dbinom{dis(i,x)}{j}j!\\&=\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=1}^n\dbinom{dis(i,x)}{j}\end{aligned} \]

    发现瓶颈在于 \(\sum\limits_{i=1}^n\dbinom{dis(i,x)}{j}\)

    而这不就是我们想要的 \(\mathcal O(1)\) 转移的组合数吗?!!

    于是设 \(dp_{i,j}\) 表示 \(\sum\limits_{u\ \text{在}\ i\ \text{的子树内}}\dbinom{dis(i,u)}{j}\),根据组合递推公式有 \(dp_{i,j}=[j=0]+\sum\limits_{v\in son_u}dp_{v,j}+dp_{v,j-1}\)

    这样就可以 \(\mathcal O(1)\) 转移了。再套个换根 dp 即可通过此题。

    53. CF1278F Cards

    感觉这种题目套路性还是蛮强的……

    二话不说直接开始颓柿子:

    \[\begin{aligned}ans&=\sum\limits_{i=0}^ni^k\dbinom{n}{i}(\dfrac{1}{m})^i(\dfrac{m-1}{m})^{n-i}\\&=(\dfrac{m-1}{m})^n\sum\limits_{i=0}^ni^k\dbinom{n}{i}(\dfrac{1}{m-1})^i\\&=(\dfrac{m-1}{m})^n\sum\limits_{i=0}^n(\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{i}{j})\dbinom{n}{i}(\dfrac{1}{m-1})^i\\&=(\dfrac{m-1}{m})^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=j}^n\dbinom{n}{i}\dbinom{i}{j}(\dfrac{1}{m-1})^i\\&=(\dfrac{m-1}{m})^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum\limits_{i=j}^n\dbinom{n}{j}\dbinom{n-j}{i-j}(\dfrac{1}{m-1})^i\\&=(\dfrac{m-1}{m})^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}\sum\limits_{i=0}^{n-j}\dbinom{n-j}{i}(\dfrac{1}{m-1})^{i+j}\\&=(\dfrac{m-1}{m})^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}(\dfrac{1}{m-1})^{j}\sum\limits_{i=0}^{n-j}\dbinom{n-j}{i}(\dfrac{1}{m-1})^{i}\\&=(\dfrac{m-1}{m})^n\sum\limits_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\dbinom{n}{j}(\dfrac{1}{m-1})^{j}(\dfrac{m}{m-1})^{n-j}\end{aligned} \]

    完成。

    多项式综合题

    54. CF553E Kyoya and Train

    首先我们设 \(dp_{i,j}\) 表示当前在点 \(i\),已经过去了 \(j\) 时刻,能够到达 \(n\) 的最小期望时间,那么:

    • \(dp_{i,j}=0(i=n,j\le t)\)
    • \(dp_{i,j}=x(i=n,j>t)\)
    • \(dp_{i,j}=dis(i,n)(i\ne n,j\ge t)\)
    • \(dp_{i,j}=\min\limits_{a_e=i}c_e+\sum\limits_{k=1}^tp_{e,k}\times dp_{b_e,j+k}\)

    前三种情况显然可以预处理出来,至于第四种情况,我们记 \(g_{e,j}=\sum\limits_{k=1}^tp_{e,k}\times dp_{b_e,j+k}\),那么我们就用 \(g_{e,j}+c_e\) 去更新 \(dp_{a_e,j}\),而 \(g_{e,j}\) 的转移式又可以写成差卷积的形式,可以用分治 FFT 求出,时间复杂度 \(n^3+nt\log t\)

    55. P4463 [集训队互测 2012] calc

    题解

    56. P5850 calc加强版

    题解

    57. P4705 玩游戏

    首先题目等价于对所有 \(k=1,2,3,\cdots,t\)\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m(a_i+b_j)^k\),期望的话就除个 \(nm\) 即可。

    考虑将这东西用二项式定理展开为 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{l=0}^k\dbinom{k}{l}a_i^lb_j^{k-l}\),把二项式系数展开即可得到 \(k!\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{l=0}^k\dfrac{a_i^l}{l!}\dfrac{b_j^{k-l}}{(k-l)!}\),再交换求和号,将 \(l\) 提到外面又有 \(k!\sum\limits_{l=0}^k\sum\limits_{i=1}^n\dfrac{a_i^l}{l!}\sum\limits_{j=1}^m\dfrac{b_j^{k-l}}{(k-l)!}\),哦吼,这下 \(i,j\) 可以独立计算了,记 \(f_r=\sum\limits_{i=1}^n\dfrac{a_i^r}{r!},g_r=\sum\limits_{i=1}^n\dfrac{b_i^r}{r!}\),那么 \(ans_k=k!\sum\limits_{l=0}^kf_lg_{k-l}\),这显然是一个卷积的形式,求出 \(f,g\) 后卷一下即可。

    最后就是怎样求 \(f,g\),这显然等价于对一个序列 \(a\)\(k=1,2,3,\cdots,t\)\(\sum\limits_{i=1}^na_i^k\),这里又有一个套路,设 \(c_k=\sum\limits_{i=1}^na_i^k\),考虑 \(c\) 序列的生成函数 \(F(x)\),那么显然 \(F(x)=\sum\limits_{i=1}^n\dfrac{1}{1-a_ix}\),并且注意到 \(\ln'(\dfrac{1}{1-a_ix})=-\dfrac{a_i}{1-a_ix}\),而 \(F(x)=\sum\limits_{i=1}^n\dfrac{1}{1-a_ix}=n-\sum\limits_{i=1}^n-\dfrac{a_i}{1-a_ix}\),故我们有 \(F(x)=n-\sum\limits_{i=1}^n\ln'(\dfrac{1}{1-a_ix})=n+\sum\limits_{i=1}^n\ln'(1-a_ix)\),根据导数的和等于和的导数可知,\(F(x)\) 又等于 \(n+(\sum\limits_{i=1}^n\ln(1-a_ix))'=n+(\ln\prod\limits_{i=1}^n(1-a_ix))'\),里面的 \(\prod\) 可以通过分治递归求出求出来之后再 \(\ln\) 一遍,\(\text{direv}\) 一遍即可。

    58. CF848E Days of Floral Colours

    题解

    59. P4002 [清华集训2017]生成树计数

    题解

  • 相关阅读:
    学习GlusterFS(二)
    并不对劲的莫比乌斯反演
    并不对劲的WC2019
    并不对劲的loj2134:uoj132:p2304:[NOI2015]小园丁与老司机
    并不对劲的bzoj3626:loj2558:p4211:[LNOI2014]LCA
    并不对劲的bzoj3214:p3333:[ZJOI2013]丽洁体
    并不对劲的bzoj4827:loj2020:p3723:[AHOI/HNOI2017]礼物
    并不对劲的bzoj4560:p3269:[JLOI2016]字符串覆盖
    并不对劲的p2664树上游戏
    并不对劲的p3709:大爷的字符串题
  • 原文地址:https://www.cnblogs.com/ET2006/p/fftnttdxsschs2.html
Copyright © 2011-2022 走看看