专题:生成函数与FFT
生成函数与FFT学习笔记
生成函数
一般生成函数(OGF)
定义
对于序列\(a_0,a_1,a_2,...\),构造函数\(G(x)=a_0+a_1x+a_2x^2+...\),称\(G(x)\)为序列\(a_0,a_1,a_2,...\)的生成函数
数字组合问题
问题:
有数字\(1,2,3,4\)。从中取出一些数相加,能够组成哪些数?每个数有几种组合方式?
解法:
数字\(n\)有\(0\)个和\(1\)个两种取法,对应的生成函数为\(x^{0\times n}+x^{1\times n}=1+x^{n}\)
我们将数字\(1,2,3,4\)的生成函数相乘,展开得到
\((1+x)(1+x^2)(1+x^3)(1+x^4)=1+x+x^2+2x^3+2x^4+2x^5+2x^6+2x^7+x^8+x^9+x^{10}\)
结果的含义是,有\(1\)种方案可以得到数字\(0,1,2,8,9,10\),有两种方案可以得到\(3,4,5,6,7\)
例如\(6=1+2+3=2+4\)。实质上是求解若干组合对象的笛卡尔积,可以根据多项式乘法的组合意义得到系数与方案数相等。
整数划分问题
问题:
将整数\(n\)划分为若干整数的和,有多少不同的划分方法?
解法:
同理,考虑\((1+x+x^2+...)(1+x^2+x^4+...)(1+x^3+x^6+...)\)的展开式第\(n\)项系数即可。
BZOJ3028 食物
题意:
有若干种物品,每种物品选取的限制如下:
A :偶数个
B :小于等于 1 个
C :小于等于 2 个
D :奇数个
E :4 的倍数个
F:小于等于 4 个
G:小于等于 1 个
H:3 的倍数个
求从中选择 n 个物品的方案数,对10007取模。\(n\le10^{500}\)
题解:
根据题意写出所有物品的生成函数,对于无穷项的用等比数列求和公式合并,计算得到它们的乘积为\(\frac{x}{(1-x)^4}\),如何求出第\(n\)项的系数呢?
多项式的Taylor展开与莱布尼兹公式
我们有Taylor公式:\(f(x)=\sum\limits_{i=0}^{\infty} \frac{f^{(i)}\left(x_{0}\right)}{i !}\left(x-x_{0}\right)^{i}\)
将多项式在\(x=0\)处展开,可以得到第\(n\)项系数为$ \frac{f^{(n)}(0)}{n !}$
我们有莱布尼兹公式:\((u * v)^{(n)}=\sum\limits_{i=0}^{n}\binom{n}{i}u^{(i)} v^{(n-i)}\)
这里代入\(u=x,v=(1-x)^{-4}\)
注意到\(i\ne1\)时有\(u^{(i)}(0)=0\),故\(f^{(n)}(0)=n\times1\times v^{(n-1)}(0)=\frac{n(n+2)!}{3!}\)
故答案为\(\frac{n(n+1)(n+2)}{6}\)
另解:显然\(\frac{x}{(1-x)^4}\)的\(n\)次项系数等于\(\frac{1}{(1-x)^4}\)的\(n-1\)次项系数
另解:
广义二项式定理
定义\(\binom{a}{k}=\frac{\prod_{i=1}^{k}(a-i+1)}{k !}\),则广义二项式定理成立对任意整数\(a\)成立:\((x+y)^{a}=\sum\limits_{i=0}^{\infty}\binom{a}{i} x^{i} y^{a-i}\)
注意到\(n\)很大,可以读入为字符串然后一位一位取模,并且可以用快速幂求出\(6\)的逆元为\(1668\)。
//
// Created by vv123 on 2022/8/9.
//
#include <bits/stdc++.h>
using namespace std;
const int mod = 10007, inv6 = 1668;
int main() {
string s;
cin >> s;
int n = 0;
for (auto ch : s) {
n = (n * 10 + ch - '0') % mod;
}
cout << n * (n + 1) % mod * (n + 2) % mod * inv6 % mod << "\n";
return 0;
}
指数型生成函数(EGF)
定义
对于序列\(a_0,a_1,a_2,...\),构造函数\(G(x)=a_0+\frac{a_1}{1!}x+\frac{a_2}{2!}x^2+...\),称\(G(x)\)为序列\(a_0,a_1,a_2,...\)的指数型生成函数
排列问题
问题:
有\(n\)种物品,每种物品有\(a_i\)件,问从中取出\(m\)件物品的不同排列数(同种物品被认为是相同的)。
解法:
举例说明,假设物品的多重集为$\left { A,A,B,B,C\right } \(,从中取出两件物品的排列有\)\left { AA,AB,BA,AC,CA,BB,BC,CB\right } $共8种。
我们考虑按照普通生成函数进行计算,得到的结果是将同种物品看作不同物品的组合数,实际答案为该系数乘\(m!\)除以每个物品种类数的阶乘。或者说,设系数为\(p\),答案为\(\frac{p\cdot m!}{t_1!t_2!...t_n!}\),其中\(t_i\)表示第\(i\)种物品取了多少个。
如果我们考虑提前在生成函数中除掉\(t_i!\),则答案为\(p\cdot m!\),可以得到以上例子的指数型生成函数
\(G(x)=(1+\frac{x}{1!}+\frac{x^2}{2!})(1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!})(1+\frac{x}{1!})\)
如果展开后将\(i\)次项的分母整理为\(i!\),则\(m\)次项的分子则为所求的答案。
BZOJ3456 城市规划
题意:
求 n 个点带标号的连通图个数。 \(n\le10^5\)
题解:
(未完待续)

浙公网安备 33010602011771号