Part 1

基础组合数学

::::info[前置]

\[\binom{n}{i}\binom{i}{j}=\binom{n}{j}\binom{n-j}{i-j} \]

\[(a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i} \]

问题一

\(n\) 个相同的小球放入 \(m\) 个不同的盒子,盒子可以为空。

方案数为 \(\binom{n+m-1}{m-1}\)。(插板法)


问题二

\(n\) 个相同的小球放入 \(m\) 个不同的盒子,每个盒子最多放 \(k\) 个,盒子可以为空。

考虑进行简单的容斥。

考虑强行给某些盒子 \(k+1\) 个球得到不合法方案,转化为问题一来求。

答案为

\[\sum_{i=0}^m (-1)^{i-1}\binom{m}{i}F(n-i(k+1),m) \]

其中,\(F(n,m)=\binom{n+m-1}{m-1}\)

::::

::::success[CCPC2023 秦皇岛热身赛 ]

把赢局视为小球,输局视为隔板,由于 \(n,m\) 确定,小球总数和盒子数都是确定的。

问题转化为:\(\sum_{i=1}^{n-m+1}a_i=m\),且 \(\max\{a_i\}=k\) 的方案数。

考虑简单容斥:考虑将问题改为 \(a_i\le k\) 的方案数,即上述问题二,则用 \(ans(a_i\le k)-ans(a_i<k)\) 即可。

复杂度 \(O(n)\)

细节:\(k=0\) 时特判。

::::

::::success[AT_agc013_e Placing Squares]

转化

  1. 在非标记的位置可以放上隔板。

  2. 在每个分隔出的区域之间要刚好放上一黑一白两个球,可以重叠。

则所有隔板和球的放法的方案数就是答案。

第一条限制可以分割出所有的正方形边长。

第二条限制是乘法原理,对应面积。

开始 \(dp\)

\(f_{i,0/1/2}\) 表示目前在第 \(i\) 个位置,与上一个隔板之间已经放了 \(0/1/2\) 个球。


对于转移方程:

由于第二条限制,只有 \(f_{i,2}\) 的转移可以放隔板。

\(i+1\) 的左边界可以放隔板(\(i\not \in X\))。

\[f_{i+1,0}=f_{i,0}+f_{i,2} \]

\(f_{i,0}\):不放球。

\(f_{i,2}\):放隔板,不放球。

\[f_{i+1,1}=2f_{i,0}+f_{i,1}+2f_{i,2} \]

\(2f_{i,0}\):放黑/白球。

\(f_{i,1}\):不放球。

\(2f_{i,2}\):放隔板,放黑/白球。

\[f_{i+1,2}=f_{i,0}+f_{i,1}+f_{i,2}+f_{i,2} \]

\(f_{i,0}\):放两球。

\(f_{i,1}\):放剩下一球。

\(f_{i,2}\):不放隔板,不放球。

\(f_{i,2}\):放隔板,放两球。

\(i+1\) 的左边界不可以放隔板(\(i\in X\))。

去掉对应放隔板的项即可。

\[f_{i+1,0}=f_{i,0} \]

\[f_{i+1,1}=2f_{i,0}+f_{i,1} \]

\[f_{i+1,2}=f_{i,0}+f_{i,1}+f_{i,2} \]


初始状态为 \(f_{1,0}=f_{1,2}=1,f_{1,1}=2\)

答案为 \(f_{n,2}\),直接转移是 \(O(n)\) 的。

考虑矩阵快速幂。

记状态向量为 \([f_{i,0},f_{i,1},f_{i,2}]\)

对于可以放隔板的转移矩阵:

\[\begin{bmatrix} 1& 2& 1 \\ 0& 1& 1\\ 1& 2& 2 \end{bmatrix} \]

对于不可以放隔板的转移矩阵:

\[\begin{bmatrix} 1& 2& 1 \\ 0& 1& 1\\ 0& 0& 1 \end{bmatrix} \]

复杂度 \(O(m\log n)\)

::::

::::success[P2606 [ZJOI2010] 排列计数]

发现是统计小根堆的方案数。

由于堆的形态已经确定,只用看每个位置的值。

分析一下:

堆的根一定是1,则要考虑把剩下的数往两个子树内放,可以先分出 \(n-1\) 个数哪些在左子树,哪些在右子树,方案数为 \(\large\binom{n-1}{sz_{lson}}\)。接着可以递归下去做,每次方案数为 \(\large\binom{sz_u-1}{sz_{lson}}\),递归到叶子节点结束,为了同时维护 \(sz\),考虑后序遍历。

::::

Catalan数与反射容斥

::::success[P3266 [JLOI2015] 骗我呢]

容易发现每一行只有一种数没有出现。

\(f_{i,j}\) 表示第 \(i\)\(j\) 没有出现。把行号从 0 开始标,值域为 \([1,m+1]\)

\(f_{i_j}=\sum_{k=0}^{j+1} f_{i-1,k}=f_{i,j-1}+f_{i-1,j+1}\)

初始状态为 \(f_{0,0}=1\),答案为 \(f_{n,m}\)

考虑使用格路计数。

\(f_{i,j}\) 所在点横坐标 \(x\)\(i+j\),纵坐标 \(y\)\(i\)

\((x,y)=(x-1,y)+(x,y-1)\)

起点为 \((0,0)\) 终点为 \((n+m,n)\)

由于 \(j\in [1,m+1]\),且 \(j=0\) 也参与转移,有 \(0\le x-y \le m\)

那么有两条直线 \(y=x-(m+2),y=x+1\) 不能接触。

直接使用反射容斥即可。

::::

斯特林数

::::info[概念]

第一类斯特林数 \({n\brack m}\)

求把 \(n\) 个不同元素构成 \(m\) 个非空圆排列的方案数。

\[{n\brack m}={n-1\brack m-1}+(n-1){n-1\brack m} \]

公式:

\[x^{\bar n}=\sum_{k=1}^n {n \brack k}x^k \]

\[x^{\underline{n}}=\sum_{k=1}^n(-1)^{n-k} {n \brack k}x^k \]

\[n!=\sum_{k=0}^n {n\brack k} \]


第二类斯特林数 \(n\brace m\)

求把 \(n\) 个不同元素划分成 \(m\) 个非空子集的方案数。

\[{n\brace m}={n-1\brace m-1}+m{n-1\brace m} \]

通项:

\[{n \brace k}=\frac{1}{k!}\sum_{i=0}^k (-1)^i\binom{k}{i}(k-i)^n \]

公式

\[m^n=\sum_{i=0}^m {n\brace i} i! \binom{m}{i} \]

::::

第一类斯特林数

::::success[P4609 [FJOI2016] 建筑师]

观察发现 \(n\) 一定可以被看到。

\(n\) 左边有 \(A-1\) 个从左边看一定可以看到,\(n\) 右边有 \(B-1\) 个一定可以被看到。

则把左右每个可以看到的数和被它挡住的数看作一个集合,只要把每个集合的元素确定了,然后把最大的放前面,其他随便排即可。

那么一个大小为 \(k\) 的集合排法为 \((k-1)!\),发现就是圆排列。那么,把 \(n-1\) 个数分到 \(A+B-2\) 个相同圆排列就是 \({n \brack A+B-2}\)

接着,这 \(A+B-2\) 个集合要选出 \(A-1\) 个排到左边,\(B-1\) 个排到右边,只要分配好了,两边的集合按最大值从小到大排即可。直接就是 \(\binom{A+B-2}{A-2}\)

\[ans=\binom{A+B-2}{A-1}{n-1 \brack A+B-2}$$。 :::: ### 第二类斯特林数 ::::success[[CF932E Team Work](https://www.luogu.com.cn/problem/CF932E)] 比较明显的斯特林数。 \]

\begin{aligned}
ans&=\sum_{x=1}^n x^k\binom{n}{x}\&=

\sum_{x=1}^n \sum_{i=0}^x {k \brace i} i!\binom{x}{i}\binom{n}{x}\&=

\sum_{x=1}^n \sum_{i=0}^x {k \brace i} i!\binom{n}{i}\binom{n-i}{x-i}\&=

\sum_{i=0}^k {k \brace i} i!\binom{n}{i}\sum_{x=i}^n \binom{n-i}{x-i}\&=

\sum_{i=0}^k {k \brace i} n{\underline{i}}\sum_{x=0} \binom{n-i}{x}\&=

\sum_{i=0}^k {k \brace i}n{\underline{i}}2
\end{aligned}

\[ :::: ::::success[[CF1278F Cards](https://www.luogu.com.cn/problem/CF1278F) ] \]

\begin{aligned}
ans&=\sum_{i=1}^n \binom{n}{i} i^k (\frac{1}{m})^i (\frac{m-1}{m})^{n-i} \&=
\frac{1}{mn}\sum_{i=1}n \binom{n}{i} \sum_{j=0}^i {k \brace j} j! \binom{i}{j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\sum_{i=1}^n \binom{n}{i}\binom{i}{j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\sum_{i=1}^n \binom{n}{j}\binom{n-j}{i-j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\binom{n}{j}\sum_{i=1}^n \binom{n-j}{i-j} (m-1)^{n-i} \&=
\frac{1}{mn}\sum_{j=0}i {k \brace j} j!\binom{n}{j}\sum_{i=1}^n m^{n-j}

\end{aligned}

\[ :::: ::::success[[CF622F The Sum of the k-th Powers](https://www.luogu.com.cn/problem/CF622F) 自然数幂和] \]

\begin{aligned}

\sum_{i=1}^n i^k &= \sum_{i=1}^n \sum_{j=0}^i {k\brace j} j! \binom{i}{j} \&=

\sum_{j=0}^k {k\brace j} j! \sum_{i=j}^n \binom{i}{j} \&=
\sum_{j=0}^k {k\brace j} j!\binom{n+1}{j+1}

\end{aligned}

\[瓶颈在求斯特林数,复杂度 $O(k^2)$。 :::: ::::success[[P6620 [省选联考 2020 A 卷] 组合数问题](https://www.luogu.com.cn/problem/P6620)] 以为是拉插,结果是stirling。果然,拉插是不会轻易给 $O(n^2)$ 的数据的。 **转化公式:** $$\binom{n}{k}k^{\underline{m}}=\binom{n-m}{k-m}n^{\underline{m}}\]


为了用上公式,或者说是下降幂转化组合数的trick,记 \(f(k)=\sum_{i=0}^ma_ik^i=\sum_{i=0}^mb_ik^{\underline{i}}\)

\[\large \begin{aligned} ans&=\sum_{k=0}^n f(k)x^k\binom{n}{k} \\&= \sum_{k=0}^n x^k \sum_{i=0}^m b_ik^{\underline{i}} \binom{n}{k} \\&= \sum_{k=0}^n x^k \sum_{i=0}^m b_in^{\underline{i}} \binom{n-i}{k-i} \\&= \sum_{i=0}^m b_in^{\underline{i}}\sum_{k=i}^n \binom{n-i}{k-i} x^k\\&= \sum_{i=0}^mb_in^{\underline{i}}x^i\sum_{k=0}^{n-i} \binom{n-i}{k} x^k\\&= \sum_{i=0}^mb_in^{\underline{i}}x^i(x+1)^{n-i} \end{aligned} \]

做到这里就把组合数化掉了,斯特林数和下降幂都是容易求的。


再来看历史遗留问题 \(b_i\) 的值:

\[\large\begin{aligned} f(k)&=\sum_{i=0}^ma_ik^i \\&= \sum_{i=0}^ma_i\sum_{j=0}^k {i\brace j} k^{\underline{j}} \\&= \sum_{j=0}^m\sum_{i=j}^ma_i {i\brace j} k^{\underline{j}} \\&= \sum_{i=0}^m\sum_{j=i}^ma_j {j\brace i} k^{\underline{i}} \end{aligned} \]

所以

\[b_i=\sum_{j=i}^m{j\brace i}a_j \]

\(b_i\) 可以 \(O(m^2)\) 做。

总复杂度为 \(O(m^2)\),瓶颈在求斯特林数和求 \(b_i\)

::::

::::success[CF1342E Placing Rooks 组合意义]

  1. \(k=0\) 时,\(ans=n!\)

  2. \(k\ge n\) 时,\(ans=0\)

  3. \(1\le k\le n-1\)

根据条件,每一行或每一列至少要放一个车。

从每一行要放车的视角来看:

发现只要有 \(k\) 列不放车,就必然会有 \(k\) 对车相互攻击。那么在剩下的 \(n-k\) 中,\(n\) 辆车被分到了 \(n-k\) 个不同的盒子,盒子非空。

由于第二类斯特林数要求相同的盒子,所以应该是 \((n-k)!{n \brace n-k}\)

然后要先选出 \(n-k\) 列,所以要乘 \(\binom{n}{n-k}\)

由于行的视角和列的视角时一样的,所以还要乘 \(2\).

\[ans=2\binom{n}{n-k}(n-k)!{n \brace n-k} \]

发现数据范围不能推斯特林数,考虑通项。

\[\begin{aligned} ans&=2\binom{n}{n-k}\sum_{i=0}^{n-k}(-1)^i\binom{n-k}{i}(n-k-i)^n \end{aligned} \]

复杂度 \(O(n\log n)\)

::::

拉格朗日插值

::::info[概念]

已知 \(n\) 次多项式 \(f(x)\)\(n+1\) 个点值 \((x_i,y_i)\),有:

\[f(k)=\sum_{i=0}^{n}y_i\prod_{j\not =i}\frac{k-x_j }{x_i-x_j} \]

可以做到 \(O(n^2)\) 求一个点值。

::::

::::success[CF622F The Sum of the k-th Powers 自然数幂和]

使用斯特林数可以做到 \(O(k^2)\)

使用拉格朗日插值可以做到 \(O(k\log k)\)

结论:自然数幂和是一个关于 \(n\)\(k+1\) 次多项式。

我们容易得到前 \(k+2\) 项的自然数幂和。

为了方便计算,我们处理出 \(F=\prod (x-x_i)\)

则有

\[ans=F\sum_{i=1}^{k+2}\frac{y_i}{(x-x_i)\prod\limits_{j<i}(x_i-x_j)\prod_{j>i}(x_i-x_j)} \]

若取 \(x_i=i\),有

\[ans=(n-1)^{\underline{k+2}}\sum_{i=1}^{k+2}\frac{y_i}{(x-x_i)(i-1)!(-1)^{\underline{k+2-i}}} \]

阶乘和下降幂都可以直接线性推,所以瓶颈在求 \(k+2\) 个点值和求逆元使用的快速幂,复杂度 \(O(k\log k)\)


更新!!!!!!

前面推出来的式子还存在问题。如果存在 \(i\) 使得 \(x=x_i\),则 \(F=0\),且 \((x-x_i)\) 的逆元也无法求。

正确的做法是避免逆元,通过前缀积和后缀积拼凑出结果。

\[ans=\sum_{i=1}^{k+2}\frac{y_i\prod\limits_{j=1}^{i-1}(x-i)\prod\limits_{j=i+1}^{k+2}(x-i)}{(i-1)!(-1)^{\underline{k+2-i}}} \]

::::

Part 2

容斥

::::info[概念]

\[\begin{aligned} |\bigcup_{i=1}^n P_i|&=\sum_{S⊆ \{1,2,\dots,n\}}(-1)^{|S|-1}|\bigcap_{i\in S}P_i|\\&= \sum_{k=1}^n (-1)^{k-1}\sum_{|S|=k}|\bigcap_{i\in S}P_i| \end{aligned} \]

::::

::::success[CF1895F Fancy Arrays [存在/任意]容斥]

对于第一个限制,我们转为一个更容易的 [存在] 和一个 [任意]。

\[ans(\exist a_i\in [x,x+k-1])=ans(\exist a_i\in [0,x+k-1])-ans(\forall a_i\in [0,x-1]) \]

  1. 对于 \(ans(\exist a_i\in [0,x+k-1])\)

只要保证最小值小于 \(x+k\) 即可。

为了找到最小值的位置,且方便满足第二个限制,我们先确定出差分数组,差分数组只会影响相对位置,以确定最小值的位置,而不影响最小值的绝对大小。

则差分数组有 \(n-1\) 项,每一项都属于 \([-k,k]\) 之间,有 \(2k+1\) 种取值,且互不干扰。所以差分数组有 \((2k+1)^{n-1}\) 种。

然后在让最小值位于 \([0,x+k-1]\),有 \(x+k\) 种取值,所以 \(ans=(x+k)(2k+1)^{n-1}\)

  1. 对于 \(ans(\forall a_i\in [0,x-1])\)

发现 [任意] 这个限制就比较宽松。

我们可以直接 \(dp\) ,记 \(f_{i,j}\) 表示考虑前 \(i\) 个数且 \(a_i=j\) 的方案数。

\[f_{i,j}=\sum_{k=\max(0,j-k)}^{\min(x-1,j+k)} f_{i-1,k} \]

复杂度为 \(O(nx)\)

考虑矩阵快速幂优化 \(dp\),做到 \(O(x^3\log n)\)

当然,如果 \(k\ge x-1\),此处 \(ans=x^n\)

::::

::::success[P3349 [ZJOI2016] 小星星]

算法一:

考虑树形dp。

\(f_{u,i,S}\) 表示现在在考虑 \(u\) 的子树,\(u\) 映射到 \(i\)\(S\) 表示 \(u\) 子树内的点所映射到的集合。

\[f_{u,i,S}=\prod_{v\in son_u}\sum_{T \cap S =\phi}\sum_{j\in T}[e(i,j)\in E] f_{v,j,T} \]

算一下时间复杂度,发现要枚举 \(i,S,T,j\) ,再加上树形dp的遍历复杂度,总复杂度为 \(O(n^33^n)\)。可过 \(n\le 10\)


接下来把 \(3^n\) 优化掉。

考虑去掉 \(S\) 这一维,再用容斥。

新的转移方程为:

\[f_{u,i}=\prod_{v\in son_u}\sum_{j=1}^n [e(i,j)\in E] f_{v,j} \]

要枚举 \(i,j\),复杂度 \(O(n^3)\)

由于没有限制 \(j\) 的范围,所以其中会出现多重映射。

如果记 \(g_S\) 表示限制 \(j\in S\) 做上述转移的结果。

\[ans=\sum_{S⊆\{1,2,\dots,n\}}(-1)^{n-|S|}g_S \]


考虑来理解一下这是怎么回事。

对于一个 \(g(\{i\})\),只有一个元素的情况,每个点都会重复映射到 \(i\),可以理解为 \(i\) 在做全集时所重复映射的值,然后通过容斥得到全集的没有重复映射的结果。

::::

::::info[凑容斥系数]

:::info[广义容斥框架]

目标:求满足条件 \(ans\) 的对象的贡献和。
方法:

  1. 构造容易计算的条件 \(C_1, C_2, \dots, C_n\)(通常是" 至少")。
  2. 为每个条件设计容斥系数 \(f_1, f_2,\dots, f_n\)
  3. 使得每个对象都满足:

\[\sum_{i=1}^n(在C_i下被计数次数) × f_i = (在ans的贡献) \]


错排问题: 求满足所有 \(pi \not= i\) 的 长度为 \(n\) 的排列个数(记为 \(D_n\))。

条件 \(C_k\) 表示至少有 \(k\) 个位置 \(p_i=i\) 的排列个数。

考虑一个有 \(m\) 个位置 \(p_i=i\) 的排列,其对 \(C_k\) 的计算次数为 \(\binom{m}{k}\),其对 \(ans\) 的贡献为 \([m=0]\)

列出方程:

\[\sum_{k=0}^m \binom{m}{k}f_k=[m=0] \]

对于所有 \(m\in [0,n]\) 都满足此式,一共有 \(n+1\) 个式子,\(n+1\) 个变量,可以解出 \(f_k\)

直接用二项式定理,\([m=0]=(1-1)^m=\sum\limits_{k=0}^m\binom{m}{k}(-1)^k\)

所以 \(f_k=(-1)^k\)


计算答案:

\[\begin{aligned} ans&=\sum_{k=0}^n C_k f_k \\&= \sum_{k=0}^n (-1)^k \binom{n}{k}(n-k)! \\&= n!\sum_{k=0}^n \frac{(-1)^k}{k!} \end{aligned} \]

:::

例:

\(n\) 个排列,每个排列有一个价值。

价值规则:如果恰好有 \(k\) 个位置满足 \(p_i \not= i\),价值为 \(a_k\)

求所有排列的价值之和。


解法一:

\(C_k\)(\(k\in [0,n]\)) 表示至少有 \(k\) 个位置满足 \(p_i=i\) 所有排列的价值和。

考虑通过容斥解决。

如果是一般的容斥我们在重复计算和去重时的权值可能不同,无法得到正确答案。

考虑配上一个系数使得容斥的结果正确。

对于一个有 \(m\) 个位置满足 \(p_i=i\) 的排列,它对 \(C_k\) 的计数次数为 \(\binom{m}{k}\),它对 \(ans\) 的贡献为 \(a_n-m\)

有:

\[\sum_{k=0}^m \binom{m}{k}f_k=a_{n-m} \]

其中,直接有 \(f_0=a_n\)

则可以从 \(0\)\(n\) 递推出所有 \(f_k\),复杂度 \(O(n^2)\)

\[\begin{aligned} ans&=\sum_{k=0}^n \binom{n}{k}(n-k)!f_k \\&= n!\sum_{k=0}^n \frac{f_k}{k!} \end{aligned} \]


解法二:

直接使用组合意义。

\[ans=\sum_{k=0}^n \binom{n}{n-k}D_ka_k \]

::::

反演

二项式反演

::::info[二项式反演]

第一形式

\[g_n=\sum_{i=0}^n\binom{n}{i}f_i \iff f_n=\sum_{i=0}(-1)^{n-i}\binom{n}{i}g_i \]

此式可以把恰好转为选择意义上的至多

:::warning[证明]

\[\sum_{k=0}^n(-1)^k\binom{n}{k}=[n=0] \]

\[\begin{aligned} f_n&=\sum_{m=0}^n [n-m=0]\binom{n}{m}f_m\\&= \sum_{m=0}^n \sum_{k=0}^{n-m}(-1)^k\binom{n-m}{k}\binom{n}{m}f_m \\&= \sum_{m=0}^n \sum_{k=0}^{n-m}(-1)^k\binom{n-k}{m}\binom{n}{k}f_m \\&= \sum_{k=0}^{n}(-1)^k\binom{n}{k}\sum_{m=0}^{n-k} \binom{n-k}{m}f_m \\&= \sum_{k=0}^n(-1)^k\binom{n}{k}g_{n-k}\\&= \sum_{i=0}^n(-1)^{n-i}\binom{n}{i}g_i \end{aligned} \]

:::

第二形式

\[g_k=\sum_{i=k}^n\binom{i}{k}f_i\iff f_k=\sum_{i=k}^n (-1)^{i-k}\binom{i}{k}g_i \]

此式可以把恰好转为钦定意义上的至少

::::

::::success[AT_abc423_f Loud Cicada]

转为求至少。

\(g_i\) 表示至少 \(i\) 只蝉的方案数。

\[g_m=\sum_{|S|=m} \lfloor \frac{Y}{lcm_{i\in S}a_i}\rfloor \]

直接二项式反演形式二:

\[ans=\sum_{i=m}^n(-1)^{i-m}\binom{i}{m}g_i \]

::::

::::success[P10596 BZOJ2839 集合计数]

考虑恰好转至少。

\(g_i\) 为交集至少为 \(i\) 的方案数。

\[g_k=\binom{n}{k}(2^{2^{n-k}}-1) \]

接下来直接反演。

::::

::::success[P4859 已经没有什么好害怕的了]

\(f_i\) 表示恰好有 \(i\)\(a>b\) 的方案数。

\(n+k\) 为奇数,则无解。

\(n+k\) 为偶数,则答案为 \(f_{\frac{n+k}{2}}\)

直接把 \((n+k)/2\) 记为 \(k\),考虑计算 \(f_k\)


转化恰好钦定至少

\(g_i\) 表示现在钦定至少有 \(i\)\(a>b\) 的方案数。

\(dp_{i,j}\) 表示前 \(i\) 个位置,匹配了 \(j\)\(a>b\) 的方案数。容易转移。

\(g_i=(n-i)!dp_{n,i}\)

使用二项式反演第二种形式即可。

::::

::::success[P6076 [JSOI2015] 染色问题 多重二项式反演叠加]

文字中都是至少,其实是 [恰好有 \(n\) 行出现染色] [恰好有 \(m\) 行出现染色] [恰好有 \(C\) 种颜色出现过]

考虑直接把三个恰好全部转为至少:

\(g_{i,j,k}\) 表示至多有 \(i\) 行,至多有 \(j\) 列出现了染色,至多有 \(C\) 种颜色可用。

\(g_{i,j,k}=(k+1)^{ij}\)

这里的答案为

\[\sum_{k=0}^C(-1)^{C-k}\binom{C}{k}\sum_{j=0}^m(-1)^{m-j}\binom{m}{j}\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}(k+1)^{ij} \]

直接做是 \(O(nmC\log(nm))\) 的,可过。

在第一层循环预处理 \(k+1\) 的幂,可做到 \(O(nmC)\)


其实可以优化为两个求和。

看最后一个求和,整理为:

\[\sum_{i=0}^n\binom{n}{i}(-1)^{n-i}((k+1)^{j})^{i} \]

由于 \(g_{i,j,k}\) 中有一层 \(()^i\) ,刚好可以用二项式定理搞回去。

所以这一个求和化为 \(((k+1)^j-1)^n\),复杂度降为 \(O(Cm\log n)\)

::::

::::success[AT_abc235_g Gardens]

发现可以把恰好 \(n\) 个花园转为至多 \(n\) 个花园。

至多 \(x\) 个的方案数

\[g_x=(\sum_{i=1}^A \binom{x}{i})(\sum_{i=1}^B \binom{x}{i})(\sum_{i=1}^C \binom{x}{i}) \]

发现一个式子,

\[\sum_{i=1}^n \binom{x}{i}=(\sum_{i=1}^n \binom{x-1}{i})\times 2 - \binom{x}{n} \]

容易在杨辉三角上证。

则可以用此式来递推所有 \(n\)\(\sum\limits_{i=1}^{A/B/C}\binom{n}{i}\)

复杂度 \(O(n)\)

::::

::::success[P10597 BZOJ4665 小 w 的喜糖]

\(g_x\) 表示至少有 \(x\) 个位置相同的方案数,\(m\) 表示颜色数。

套用二项式反演

\[ans=\sum_{i=0}^{n}(-1)^ig_i \]


考虑 \(dp\)\(g_i\)

\(f_{i,j}\) 表示前 \(i\) 种颜色至少有 \(j\) 个位置相同的方案数。

\[f_{i,j}=\sum_{k=0}^{\min(cnt_i,j)} \frac{f_{i-1,j-k}\binom{cnt_i}{k}}{(cnt_i-k)!} \]

\(g_i=(n-i)!f_{m,i}\)

其中的阶乘拼一起就是多重集排列数。

分析一下发现,复杂度其实是 \(O(n^2)\) 的。

::::

::::success[P6478 [NOI Online #2 提高组] 游戏]

把恰好转为至少。

\(g_i\) 表示至少 \(i\) 次非平局的方案数。

再记 \(f_{i,j,0/1}\) 表示 \(i\) 的子树内,以及钦定了 \(j\) 组非平局,\(i\) 点当前没有/已经被钦定。

容易写出转移方程。复杂度 \(O(n^2)\)

\[g_i=(dp_{1,i,0}+dp_{1,i,1})(m-i)! \]

\[f_k=\sum_{i=k}^m (-1)^{i-k}\binom{i}{k}g_i \]

当然,也可以设为 \(f_{i,j}\),转移方程不同,常数更小。

::::

::::info[小结]

一般可以通过二项式反演来简化问题中的恰好

  1. 使用完二项式反演后,可能要 \(dp\) 或使用组合意义。

  2. 可以使用高维二项式反演。若复杂度过高,需优化或考虑组合意义。

::::

子集反演

::::info[子集反演]

\[g_S=\sum_{T\subset S}f_T \iff f_S=\sum_{T\subset S} (-1)^{|S|-|T|}g_T \]

:::warning[证明]

\[\sum_{T\sube S}(-1)^{|T|}=[|S|=0] \]

\[\begin{aligned} f_S&=\sum_{T\sube S} [|S-T|=0] f_{T} \\&= \sum_{T\sube S} f_T \sum_{P\sube S-T} (-1)^{|P|}\\&= \sum_{P\sube S}(-1)^{|P|}\sum_{T\sube S-P} f_T \\&= \sum_{P\sube S}(-1)^{|P|}g_{S-P} \\&= \sum_{T\sube S} (-1)^{|S|-|T|} g_T \end{aligned} \]

:::

\[g_S=\sum_{S\sube T} f_T \iff f_S=\sum_{S\sube T}(-1)^{|T|-|S|} g_T \]

::::

::::success[P6442 [COCI 2011/2012 #6] KOŠARE]

使用子集反演,转恰好为子集。

\(f_S\) 表示种类恰好为 \(S\) 的方案数,\(g_S\) 表示种类为 \(S\) 的自己的方案数。

则显然有

\[g_S=\sum_{T\sube S}f_T \]

可以使用子集反演。

然后记 \(h_S\) 表示种类是 \(S\) 的子集的盒子数量,可以使用高位前缀和求。

\(g_S=2^{h_S}\),问题解决。

::::

::::success[AT_arc101_c Ribbons on Tree]

考虑子集反演。

\(f_S\) 表示恰好 \(S\) 中的边没有被染色的方案数。

\(g_S\) 表示至少 \(S\) 中的边没有被染色的方案数,即染色的边集是 \(E-S\) 的子集。

\[g_{S}=\sum_{S \sube T}f_T \]

子集反演为:

\[f_S=\sum_{S\sube T}(-1)^{|T|-|S|}g_T \]

答案为

\[f_{\phi}=\sum_{T}(-1)^{|T|}g_T \]


接着树形DP。

\(dp_{u,i}\) 表示点 \(u\) 的子树内,与 \(u\) 相连的连通块大小为 \(i\)。若边未染色,视为断开。

对于每个子节点 \(v\),有

\[dp_{u,i}\gets -dp_{u,i}\times dp_{v,j} \times val_j \]

表示 \((u,v)\) 这条边断开,并计算 \(v\) 连通块内的方案数。其中 \(val_j=(j-1)(j-3)(j-5)\dots\) (\(j\) 为偶数),表示与 \(v\) 相连的连通块内的连边方案数(当然这样可能会产生没有被染色的边,但我们求的是至少)。\((-1)\) 是把系数 \((-1)^{|T|}\) 放入了 \(dp\) 中,这里是把 \((u,v)\) 计入了 \(T\),使得 \(|T|\) 变化。

\[dp_{u,i+j}\gets dp_{u,i}\times dp_{v,j} \]

表示 \((u,v)\) 这条边连上。

边界为 \(dp_{u,1}=1\)

则答案为

\[\sum_{i=1}^n val_idp_{1,i} \]

复杂度为树形DP的复杂度 \(O(n^2)\)

::::

\(\min\)-\(\max\) 反演

::::info[\(\min\)-\(\max\) 反演]

\[\max(S)=\sum_{T\sube S}(-1)^{|T|+1} \min(T) \]

该结论在期望意义下也成立。即:

\[E(\max(S))=\sum_{T\sube S}(-1)^{|T|+1} E(\min(T)) \]

推广:

\[kth\max(S)=\sum_{T\sube S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T) \]

直接证明推广。

:::warning[证明]

考虑构造容斥系数。

\(kth\max(S)=\sum\limits_{T\sube S}f_{|T|}\min(T)\)

接着来算每个元素对等式两边的贡献。

对于 \(S\) 中的第 \(i\) 大的元素,我们可以从它前面 \(i-1\) 个元素中选出一些来和它组成 \(T\),则该元素为 \(\min(T)\) 的结果。

可以列出对右边的贡献:$$\sum\limits_{j=0}^{i-1}\binom{i-1}{j}f_{j+1}$$。

最左边的贡献:\([i=k]\)。(\([x]\) 为艾弗森括号)

有方程

\[\sum\limits_{j=0}^{i-1}\binom{i-1}{j}f_{j+1}=[i=k] \]

接着使用二项式反演。

\(g_{i-1}=[i=k]\)\(f'_j=f_{j+1}\)

\[g_i=\sum_{j=0}^i\binom{i}{j}f'_j \]

\[f'_i=\sum_{j=0}^i(-1)^{i-j}\binom{i}{j}g_j \]

即:

\[f_{i}=\sum_{j=0}^{i-1}(-1)^{i-1-j}\binom{i-1}{j}[j+1=k]=(-1)^{i-k}\binom{i-1}{k-1} \]

代入总式:

\[kth\max(S)=\sum_{T\sube S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T) \]

:::

::::

::::success[P3175 [HAOI2015] 按位或]

把原问题描述为最后一个数位出现的秒数的期望值,即所有数位出现秒数的最大值

考虑转为最小值,即最先出现的,这是容易求的。


给出一个具有一般性的结论:

给出一个事件成功的概率 \(p\),失败的概率 \(1-p\),重复进行事件直到事件成功,期望次数为 \(\frac{1}{p}\)


考虑求一个集合 \(S\)\(E(\min(S))\)

根据结论,考虑求出概率。

\(P(S)\) 表示能够一次得到其中一个数位的概率。

\[P(S)=\sum_{T\cap S\not =\phi}p_T=1-\sum_{T\cap S=\phi}p_T=1-\sum_{T\sube (U-S)}p_T \]

\(p\) 做高维前缀和可以 \(O(1)\)\(P(S)\) ,高位前缀和复杂度 \(O(n2^n)\)

\(E(\min(S))=\frac{1}{P(S)}\),再用 \(\min\)-\(\max\) 反演,复杂度为 \(O(2^n)\)

总复杂度为 \(O(n2^n)\)

::::

::::success[P4707 重返现世]

上一题的升级版,在反演和放容斥系数上使难度增加了很多。

考虑像前一题一样转化,改为求第 \(k\) 大,这里的 \(k\) 可以表示为原题给出的 \(n-k+1\)

先把反演公式供上来:

\[E(kth\max(U))=\sum_{T\sube U} (-1)^{|T|-k}\binom{|T|-1}{k-1}E(\min(T)) \]

其中 \(E(\min(T))\) 同上题求法,为 \(\Large\frac{m}{\sum_{i\in T}p_i}\)

然后发现需要 \(O(n2^n)\) 的复杂度来求。


由于式子中只有 \(T\) 一个变量,考虑用关于 \(T\) 的 dp 来计算。

\(f_{i,j}\) 表示满足只考虑前 \(i\) 个物品,\(\sum\limits_{i\in T}p_i=j\)\(\sum_{T\sube U}(-1)^{|T|-k}\binom{|T|-1}{k-1}\) 总值。

有转移方程

\[f_{i,j}\gets f_{i-1,j} \]

表示不把 \(i\) 加入 \(T\) 中,则没有任何影响。

对于加入的情况:

\(f_{i-1,j-p_i}\)\(f_{i,j}\),所有值的 \(|T|\) 会变,其中 \((-1)^{|T|-k}\) 只要乘 \(-1\) 即可,但是组合数不能直接变化。考虑等式 $$\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}$$,我们在 \(f_{i,j}\) 中的每一项的组合数对于 \(\binom{n}{m}\),而 \(\binom{n-1}{m}\) 就可以对应 \(f_{i-1,j-p_i}\) 中的组合数,考虑再找一个状态表示 \(\binom{n-1}{m-1}\) 来做整体转移。

由于 \(\binom{n-1}{m-1}\) 中对应 \(\binom{|T|-2}{k-2}\),而在已有的状态里,都是下面为 \(k-1\) 的,无法得到这一项 \(\binom{n-1}{m-1}\),考虑扩展状态为 \(f_{i,j,k}\) 表示 \(k\) 的取值。

则有转移 :

\[f_{i,j,k}\gets f_{i-1,j,k} \]

\[f_{i,j,k}\gets -f_{i-1,j-p_i,k}+f_{i-1,j-p_i,k-1} \]

至于初始状态,可以反推出初始状态为 \(f_{0,0,0}=0\),其他 \(f_{k,0,0}=-1\)

复杂度 \(O(nmk)\),在转化后 \(k \le 11\)

实现时要把 \(i\) 这一维空间压缩掉。

::::

::::success[AT_agc038_e Gachapon]

也是第一题的升级版,在组合意义上和放容斥系数上难度增加了,可以说和上一题各有千秋。

直接使用普通的 \(\min\)-\(\max\) 容斥。

\[ans=\sum_{S\sube U}(-1)^{|S|+1}E(\min(S)) \]

则考虑求 \(E(\min(S))\),此处 \(E(\min(S))\) 表示 \(S\) 中第一次有元素顶到上界的期望次数。

首先求出单次选到 \(S\) 内部的概率,令 \(m=\sum\limits_{i=0}^{n-1} a_i\),则结果为 \(\Large\frac{m}{\sum\limits_{i\in S}a_i}\),那么期望选进 \(S\) 的次数 \(P\)\(\Large\frac{m}{\sum\limits_{i\in S}a_i}\)

来考虑如何求出这个第一次顶到上界的期望次数。

尝试刻画到达目标时的状态,记 \(S\) 中的元素 \(i\) 被选出的次数为 \(c_i\)\(k=\sum\limits_{i\in S}c_i\)。则所求其实就是 \(E(k)\)。考虑拆贡献,从每个 \(c_i=0\) 的初始状态,到最终状态,其间就共有 \(k\) 个状态,且满足 \(c_i<b_i\),每个状态都有 \(1\) 的贡献,那么求出到达每个状态的概率之和即可。那么,生成 \(k\) 个元素的概率为 \(\Large\prod\limits_{i\in S}(\frac{a_i}{\sum\limits_{i\in S}a_i})^{c_i}\),这 \(k\) 个元素出现的顺序有 \(\Large\frac{k!}{\prod\limits_{i\in S}c_i!}\) 种。总共为 \(\Large\frac{k!}{\prod\limits_{i\in S}c_i!}\prod\limits_{i\in S}(\frac{a_i}{\sum\limits_{i\in S}a_i})^{c_i}\)。当然,放在整个 \(U\) 中的话,还要乘 \(P\)

所以

\[\begin{aligned} ans&=\sum_{S\sube U}(-1)^{|S|+1}\sum_{\forall c,c_i<b_i}\frac{m}{\sum\limits_{i\in S}a_i}\frac{k!}{\prod\limits_{i\in S}c_i!}\prod\limits_{i\in S}(\frac{a_i}{\sum\limits_{i\in S}a_i})^{c_i} \\&= \sum_{S\sube U}(-1)^{|S|+1}\frac{m}{\sum\limits_{i\in S}a_i}\sum_{\forall c,c_i<b_i}\frac{k!}{\prod\limits_{i\in S}c_i!}\prod\limits_{i\in S}(\frac{a_i}{\sum\limits_{i\in S}a_i})^{c_i} \\&= \sum_{S\sube U}(-1)^{|S|+1}\frac{m}{j}\sum_{\forall c,c_i<b_i}\frac{k!}{\prod\limits_{i\in S}c_i!}\prod\limits_{i\in S}a_i^{c_i} \frac{1}{j^k} \end{aligned} \]

接下来就是 \(dp\) 了。

观察一下,后面一坨里 \(j=\sum\limits_{i\in S}a_i,k=\sum\limits_{i\in S}c_i\),则 \(j,k\) 由于需要求和不好放入 \(dp\) 里,则把它计入状态。

\(f_{i,j,k}\) 表示只考虑前 \(i\) 个元素,\(j,k\) 定义同上。然后做背包dp。

如果不选 \(i\) 加入 \(S\)

\[f_{i,j,k}\gets f_{i-1,j,k} \]

否则

\[f_{i,j,k}\gets -\frac{a_i^c}{c!}f_{i-1,j-a_i,k-c} \]

其中 \(c<b_i\)

初始状态为 \(f_{0,0,0}=-1\)。(空集的 \((-1)^{|S|+1}=-1\))

答案为

\[\sum_{j=0}^{m}\sum_{k=0}^{\sum (b_i-1)}f_{n,j,k}\frac{k!m}{j^{k+1}} \]


分析一下复杂度,要枚举 \(i,j,k,c\)\(i,c\) 的枚举总量是 \(\sum b_i\),是 \(O((\sum a_i)(\sum b_i)^2)\) 的。

::::

::::info[小结]

  1. \(\min\)-\(\max\) 反演通常用来处理期望问题。

  2. 若数据范围不支持指数复杂度的子集枚举,考虑把容斥系数放入 \(DP\)

::::

斯特林反演

::::info[斯特林反演]

\[g_n=\sum_{i=0}^n {n \brace i}f_i \iff f_n=\sum_{i=0}^n (-1)^n-i {n \brack i} g_i \]

\[g_n=\sum_{k=n}^{inf} {k \brace n}f_k \iff f_n=\sum_{k=n}^{inf} (-1)^k-n {k \brack n} g_k \]

::::

::::success[[2018 雅礼集训 1-16] 方阵]

题目描述:

给定一个 \(n \times m\) 的矩阵,每个位置可以填上 \([1,c]\) 中的任意整数。

要求填好后任意两行互不等价,且任意两列互不等价。

求方案数。

\(n,m \le 4 \times 10^3\),时限 1s。


考虑去掉列的限制,只考虑行互不等价。

\(f_{n,m}\) 表示 \(n\)\(m\) 列 不考虑列的限制的答案。有 \(f_{n,m}=(c^m)^{\underline{n}}\)

\(g_{n,m}\) 表示真实答案。

\[f_{n,m}=\sum_{i=0}^m {m\brace i}g_{n,i} \]

表示枚举 \(m\) 列中有 \(i\) 列本质不同的等价类,把 \(m\) 列分到 \(i\) 个等价类中,再用 \(g_{n,i}\) 选出这 \(i\) 个等价类以及它们之间的相对关系(毕竟斯特林数中盒子是相同的)。

再使用斯特林反演:

\[g_{n,m}=\sum_{i=0}^m (-1)^{m-i}{m\brack i}f_{n,i}=\sum_{i=0}^m (-1)^{m-i}{m\brack i}(c^i)^{\underline{n}} \]

可以 \(O(nm)\) 求解。

::::

::::info[小结]

斯特林反演一般与连通图计数有关,一般结合线性基考察。

::::

Part 3

生成函数

::::info[前置]

广义二项式系数:

\[\binom{\alpha}{k}=\frac{\alpha(\alpha-1)\dots(\alpha-k+1)}{k!}, (\alpha \in \mathbb{R},k\in\mathbb{N}) \]

广义二项式定理:

\[(x+y)^{\alpha}=\sum_{i=0}^{\infty}\binom{\alpha}{i}x^{\alpha-i}y^i,(\alpha \in \mathbb{R}) \]

上指标反转:(用于化简负数上标)

\[\binom{n}{m}=(-1)^m \binom{m-n-1}{m} \]

::::

普通型生成函数(OGF)

::::info[OGF]

对于数列 \(A_0,A_1,\dots,A_n\),其普通型生成函数定义如下:

\[A(x)=\sum_{i\ge 0}A_ix^i \]

OGF常常和“无标号”计数相关。原理可以使用乘法原理。

相关函数展开:

\[\frac{1}{1-x}=1+x+x^2+x^3+\dots \]

\[\frac{1}{(1-x)^2}=1+2x+3x^2+4x^3+\dots \]

\[\frac{1}{1+x}=1-x+x^2-x^3+\dots \]

\[\frac{1}{1-Cx}=1+Cx+C^2x^2+C^3x^3+\dots \]

有关组合意义:

\(1+x+x^2+\dots +x^k\) :至多选 \(k\) 个。

\(\Large\frac{1}{1-x}\):无限制。

\(\Large\frac{1}{1-x^2}\): 只能选偶数个。

\(\Large\frac{x}{1-x^2}\): 只能选奇数个。

\(\Large\frac{1}{1-x^k}\):只能选 \(k\) 的倍数个。

::::

::::success[P2000 拯救世界]

\[\small \begin{aligned} T(n)&=\sum\limits_{i=0}^1 x^i\sum\limits_{i=0}^3 x^i\sum\limits_{i=0}^5 x^i\sum\limits_{i=0}^7 x^i\sum\limits_{i=0}^9 x^i\frac{1}{1-x^2}\frac{1}{1-x^4}\frac{1}{1-x^6}\frac{1}{1-x^8}\frac{1}{1-x^{10}} \\&= (\frac{1}{1-x})^5 \\&= (1-x)^{-5} \\&= \sum_{i=0}^{\infty} \binom{-5}{i}(-x)^i \\&= \sum_{i=0}^{\infty} \binom{i+4}{4}x^i \end{aligned} \]

\([n]T(x)=\binom{n+4}{4}\)

::::

指数型生成函数(EGF)

::::info[EGF]

对于数列 \(A_0,A_1,\dots,A_n\),其指数型生成函数定义如下:

\[A(x)=\sum_{i\ge 0}A_i\frac{x^i}{i!} \]

EGF常常和“有标号”计数相关,即物品相互区分。

:::warning[定义原则]

对于有标号问题,当两个生成函数合并时,有

\[F(i)G(n-i)\binom{n}{i}=H(n) \]

即先选择 \(n\) 个标号中的 \(i\) 个标号给 \(F(i)\)

拆开组合数有:

\[\frac{F(i)}{i!}\frac{G(n-i)}{(n-i)!}=\frac{H(n)}{n!} \]

所以定义为 \(\Large\frac{x^i}{i!}\)

:::

相关泰勒公式:

\[e^x=\sum_{n\ge 0}\frac{x^n}{n!} \]

\[xe^x=\sum_{n\le 0}n\frac{x^n}{n!} \]

\[e^{Cx}=\sum_{n\ge 0}C^n\frac{x^n}{n!} \]

\[\ln(1-x)=-\sum_{n\ge 1}\frac{x^n}{n} \]

组合意义:

无要求:$$\large\sum\limits_{i\ge 0}\frac{xi}{i!}=ex$$

数量为偶数:$$\large\sum\limits_{i\ge 0}\frac{x{2i}}{(2i)!}=\frac{ex+e^{-x}}{2}$$

数量为奇数:$$\large\sum\limits_{i\ge 0}\frac{x{2i+1}}{(2i+1)!}=\frac{ex-e^{-x}}{2}$$

::::

::::success[P2012 拯救世界2]

\[\small \begin{aligned} T(x)&=(\frac{e^x+e^{-x}}{2}\times\frac{e^x-e^{-x}}{2})^4e^{4x} \\&= \frac{e^{4x}}{256}(e^{2x}-e^{-2x})^4\\&= \frac{1}{256} (e^{12x}-4e^{8x}+6e^{4x}+4+4e^{-4x}) \\&= \frac{1}{256}\sum_{n\ge 0} (12^n+4\times 8^n+6\times 4^n+4\times (-4)^n)\frac{x^n}{n!} \end{aligned} \]

\(ans=\frac{1}{256}(12^n+4\times 8^n+6\times 4^n+4\times (-4)^n)\)

\(n<4\) 时,\(ans=0\)

::::

多项式操作

::::info[前言]

多项式操作用于辅助生成函数的计算。

此部分不包含多项式科技(如 NTT,FFT),但多项式科技复杂度可以更优。

::::

::::info[多项式求逆]

给定 \(n\) 项多项式 \(A(x)\),求 \(B(x)A(x)\equiv 1 (\bmod \ x^n)\)

有递推式:

\[B_n=-\frac{1}{A_0}\sum_{i=1}^nA_iB_{n-i} \]

边界:\(B_0=\Large\frac{1}{A_0}\)

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

:::warning[证明]

列出方程:

\[\sum_{i=0}^n A_iB_{n-i}=[n=0] \]

此处设 \(n\ge 1\),再把 \(A_0B_n\) 一项单独拿出来。

\[A_0B_n=-\sum_{i=1}^n A_iB_{n-i} \]

\[B_n=-\frac{1}{A_0}\sum_{i=1}^nA_iB_{n-i} \]

:::

::::

::::info[多项式求 \(\ln\)]

给定 \(n\) 项多项式 \(A(x)\),求 \(B(x)\equiv \ln A(x) (\bmod \ x^n)\)。(\(A_0\not =0\)

有递推式:

\[B_n=\frac{nA_n-\sum_{i=1}^{n-1} iB_iA_{n-i}}{nA_0} \]

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

:::warning[证明]

\[B(x)=\ln A(x) \]

对两边求导:

\[B'(x)A(x)=A'(x) \]

\[A'_{n-1}=\sum_{i=1}^n B'_{i-1}A_{n-i} \]

又有 \(A'_i=(i+1)A_{i+1}\)\(B'_i=(i+1)B_{i+1}\)

\[nA_n=\sum_{i=1}^n iB_iA_{n-i} \]

\(nA_0B_n\) 一项单独拿出来:

\[nA_0B_n=nA_n-\sum_{i=1}^{n-1}iB_iA_{n-i} \]

\[B_n=\frac{nA_n-\sum_{i=1}^{n-1} iB_iA_{n-i}}{nA_0} \]

注意到 \(A_0 \not =0\)

:::

::::

::::info[多项式求exp]

给定 \(n\) 项多项式 \(A(x)\),求 \(B(x)\equiv e^{A(x)} (\bmod \ x^n)\)

有递推式:

\[B_n=\frac{1}{n}\sum_{i=1}^{n} iB_{n-i}A_i \]

边界:\(B_0=1\)

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

:::warning[证明]

\[B(x)=e^{A(x)} \]

对两边求导:

\[B'(x)=B(x)A'(x) \]

\[B'_{n-1}=\sum_{i=1}^{n} B_{n-i} A'_{i-1} \]

又有 \(A'_i=(i+1)A_{i+1}\)\(B'_i=(i+1)B_{i+1}\)

\[nB_n=\sum_{i=1}^{n} iB_{n-i}A_i \]

\[B_n=\frac{1}{n}\sum_{i=1}^{n} iB_{n-i}A_i \]

:::

::::

::::success[问题一]

你有若干种颜色不同的骨牌,其中大小为 \(1 × i\) 的骨牌共有 \(a_i\) 种。每种骨牌都可以无限量使用。用骨牌不重叠地铺满一排 \(1 × n\) 的方格,共有几种方法?(\(a_i, n ≤ 5000\))


先构建只放一个骨牌的生成函数。

有 $$A(x)=\sum a_ix^i$$,可以容易验证。

枚举放置骨牌的数量:

\[T(x)=\sum_{i=1}^{\infty}A^i(x)=\frac{1}{1-A(x)} \]

使用多项式求逆 \(O(n^2)\) 做。

::::

::::success[问题二]

求包含 \(n\) 个顶点,\(n\) 条边的连通无向图有几个。顶点有标号。不允许重边和自环。\((n ≤ 5000)\)


考虑把基环树拆为环和接在环上的树。

有标号有根树的种类的生成函数:

\[A(x)=\sum_{n\ge 1}^{\infty}n^{n-1}x^n \]

再枚举环的大小,且去除环的旋转和反转带来的重复,有:

\[T(x)=\frac{1}{2}\sum_{n\ge 3}^{\infty}\frac{A^n(x)}{n}=\frac{1}{2}(\ln(1-A(x))-A(x)-\frac{A^2(x)}{2}) \]

使用多项式求\(\ln\) \(O(n^2)\) 做。

::::

::::success[P4841 [集训队作业2013] 城市规划]

先考虑一下 \(\exp(F(x))\) 的本质。

\[\exp(F(x)) = \sum_{n\ge 0}^{\infty}\frac{F^n(x)}{n!} \]

\(F(x)\) 可以生成不同的小方案,而 \(F^n(x)\) 代表同时生成 \(n\) 个方案,即从每个 \(F(x)\) 中选出一个方案再合并为大的方案。

发现在多项式的乘法中,有不同的选择方式可以得到同一个大方案,则发现可能会有本质相同的情况被重复计算。那么容易发现算重的次数为排列数,即 \(F^n(x)\) 生成的是小方案的排列。

\(\exp(F(x))\) 中除去了重复的情况,得到的就是集合。所以 \(\exp(F(x))\) 的本质是生成所有 \(F(x)\) 可以组成的集合。


回归本题,记 \(T(x)\) 为无向简单连通图个数的生成函数,我们考虑 \(F(x)=\exp(T(x))\) 代表了什么。

依照上面的理解,\(\exp\) 就是枚举生成集合的大小,再将方案数相加。这里就是枚举生成了多少个无向简单连通图,在把方案数相加。

那么每一项系数代表了什么?

\(n\) 项的系数 \(F_n\),它包括了所有无向简单连通图构成的集合,这些集合的总大小为 \(n\)。其实,就是 \(n\) 个点的无向简单图的方案数,因为我们枚举了所有图中连通块的个数,也用 \(T(x)\) 表示了每一个连通块的情况。

在根据无向简单图的方案数有:

\[F(x)=\sum_{n\ge 1}^{\infty}2^{\frac{n(n-1)}{2}}x^n \]

\(F(x)=\exp(T(x))\),即 \(T(x)=\ln(F(x))\)\(O(n^2)\) 用多项式求 \(\ln\) 即可。


呃,发现我们的 \(F_0=0\),也就是说无法使用 \(O(n^2)\) 的求 \(\ln\),只能用多项式科技。

::::

::::success[更多问题(NTT入侵)]

P4389 付公主的背包

\(n\) 个生成函数的卷积,由于该函数的性质可以 \(O(1)\) 得到 \(\ln\) 后的系数,则先算 \(\ln\) 求和后的结果,可以做到 \(O(\sum \frac{m}{v_i})\),排完序后再合并重复的,就可以做到最劣 \(O(n\ln n)\) 的处理。最后 \(\exp\) 转为原式即可。

::::