生成函数
二项式定理
广义二项式系数\(\binom{n}m = \frac{n^{\underline{m}}}{m!}\)
广义二项式定理\((1 + x)^m = \sum_{n \ge 0} \binom{m}n x^n\)
二项式反演
普通母函数(OCF)
性质
对于一个数列 fn,定义它的普通型生成函数为 F(x)。则:
基本运算
H(x)=F(x)±G(x)
\(\left(\sum_{n \geq 0} f_{n} x^{n}\right) \pm\left(\sum_{n \geq 0} g_{n} x^{n}\right)=\sum_{n \geq 0}\left(f_{n} \pm g_{n}\right) x^{n}\)
H(x)=F(x)G(x)
\(\left(\sum_{n \geq 0} f_{n} x^{n}\right)\left(\sum_{n \geq 0} g_{n} x^{n}\right)=\sum_{n \geq 0}\left(\sum_{i=0}^{n} f_{i} g_{n-i}\right) x^{n}\)
H(x)=F(x−m)
\(\sum_{n \ge m} f_{n-m} x^{n} = \sum_{n \ge 0}f_nx^{n+m}\)
H(x)=F(x+m)
\(\sum_{n \ge 0} f_{n+m}x^n = \frac{\sum_{n \ge 0} f_nx^n – \sum_{i=0}^{m-1} f_ix^i}{x^m}\)
H(x)=F′(x)
\(\left(\sum_{n \geq 0} f_{n} x^{n}\right)^{\prime} = \sum_{n \ge 0} ((n+1)f_{n+1})x^n\)
H(x)=∫F(x)dx
\(\int\left(\sum_{n \geq 0} f_{n} x^{n}\right) \mathrm{d} x=\sum_{n>0} \frac{f_{n-1}}{n} x^{n} +C\)
H(x)=F(cx)
\(\sum_{n \ge 0} f_n(cx)^n = \sum_{n \ge 0} (c^nf_n)x^n\)
\(x^m\)
\(\begin{aligned} \sum_{n \ge 0} [n = 0] x^n &= 1 \\ \sum_{n \ge 0} [n = m] x^n &= x^m \\ \end{aligned}\)
\((1+x)^m\)
\(\begin{aligned} \sum_{n \ge 0} x^n &= \frac 1{1 – x} \\ \sum_{n \ge 0} (n+1)x^n &= \frac 1{(1 – x)^2} \\ \sum_{n \ge 0} (-1)^n x^n &= \frac 1{1 + x} \\ \sum_{n \ge 0} \binom mn x^n &= (1 + x)^m \\ \sum_{n \ge 0} \binom {n+m-1}n x^n &= (1 – x)^{-m} \\ \end{aligned}\)
e 相关
\(\begin{aligned} \sum_{n > 0} \frac{1}{n} x^n &= \ln\frac1{1-x} \\ \sum_{n > 0} \frac{-(-1)^n}{n} x^n &= \ln(1+x) \\ \sum_{n \ge 0} \frac{1}{n!} x^n &= e^x \\ \end{aligned}\)
Fibonacci
\(f_n = \begin{cases} n & n \leq 1 \\ f_{n-1} + f_{n-2} & n > 1 \\ \end{cases}\)
\(\begin{aligned}F(x) &= \sum_{n \ge 0} f_n x^n \\&= x + \sum_{n > 0} (f_n + f_{n-1}) x^{n+1} \\&= x + xF(x) + x^2F(x) \\\end{aligned}\)
\(\begin{aligned} F(x) &= \sum_{n \ge 0} f_n x^n \\ f_n &= \frac{\left(\frac{1+\sqrt5}2\right)^n – \left(\frac{1-\sqrt5}2\right)^n}{\sqrt 5} \\ \end{aligned}\)
前缀和
\(\begin{aligned} S(x) &= \sum_{n \ge 0} s_nx^n \\ &= \sum_{n \ge 0} \left(\sum_{i=0}^n f_i\right)x^n \\ &= \sum_{i \ge 0} \left(f_i \sum_{n \ge i} x^n\right) \\ &= \sum_{i \ge 0} \left(f_i \frac{x^i}{1-x}\right) \\ &= \frac{1}{1-x}\sum_{i \ge 0} f_ix^i \\ &= \frac{1}{1-x} F(x) \\ \end{aligned}\)
Catalan
\(c_n = \begin{cases} 1 & n = 0 \\ \sum_{i=0}^{n-1} c_ic_{n-i-1} & n > 0 \\ \end{cases}\)
\(\begin{aligned} C(x) &= \sum_{n \ge 0} c_nx^n \\ &= 1+\sum_{n \geq 1}\left(\sum_{i=0}^{n-1} c_{i} c_{n-i-1}\right) x^{n} \\ &= 1+x \sum_{m \geq 0}\left(\sum_{i=0}^{m} c_{i} c_{m-i}\right) x^{m} \\ &= 1 + xC^2(x) \end{aligned}\)
\(C(x)=\frac{1 – \sqrt{1-4 x}}{2 x}\)
\(\begin{aligned} \sqrt{1-4 x} &= (1-4 x)^{\frac 12} \\ &= \sum_{n \ge 0} \binom{\frac 12}n (-4x)^n \\ &= 1 + \sum_{n > 0}\frac{\left(\frac 12\right)^{\underline{n}}}{n!}(-4x)^n \\ &= 1 + \sum_{n > 0}\frac{(-1)^{n-1} (1 \times 3 \times \cdots \times (2n – 3))}{2^nn!}(-4x)^n \\ &= 1 + \sum_{n > 0}\frac{(-1)^{n-1} (2n-2)!}{2^nn!(2 \times 4 \times \cdots \times (2n-2))}(-4x)^n \\ &= 1 + \sum_{n > 0}\frac{(-1)^{n-1} (2n-2)!}{2^{2n-1}n!(n-1)!}(-4x)^n \\ &= 1 – 2\sum_{n > 0}\frac{(2n-2)!}{n!(n-1)!}x^n \\ \end{aligned}\)
\(\begin{aligned} C(x) &= \frac{1 – \sqrt{1-4 x}}{2 x} \\ &= \frac{1 – \left(1 – 2\sum_{n > 0}\frac{(2n-2)!}{n!(n-1)!}x^n\right)}{2 x} \\ &= \sum_{n \ge 0}\frac{(2n)!}{(n+1)!n!}x^n \\ &= \sum_{n \ge 0}\frac{\binom{2n}n}{n+1} x^n \\ \end{aligned}\)
Example
计算机学院有许多喜欢火火的女生。一班有2个,二班有3个,三班有2个,四班是火火的后宫,有8个喜欢火火的女生(全班女生)
如果用一个函数“f(班级)=喜欢火火女生的个数”,那么我们可以把上述信息表示成:f(1)=2,f(2)=3,f(3)=2,f(4)=8
构造这么一个多项式函数g(x),使得x的n次方系数为f(n)。
问题1.
火火在这些女生中选择自己的后宫成员,现在他对女生们的颜值等级进行排序,颜值等级为1的妹子有3个,颜值等级为2的妹子有2个,颜值等级为3的妹子有5个,颜值等级为4的妹子有5个,假设火火的后宫等级取决于所有妹子的颜值等级之和,那么火火的后宫等级共有多少种可能的情况?每种等级各有几种可能方案?
3个1级妹子可以看成
其中1表示不要这个等级的妹子,3表示有三种情况只要1个1等级的妹子........同理,另外三种情况为
则所阐述的生成函数为
最后求出的式子指数表示后宫等级,系数表示方案数。
问题2
那么假如将问题1改为无限的人数呢?由于无限后宫,我们无法计算每种情况的方案数,但是可以计算出具体的方案状况,在这种情况下生成函数系数全置1
那么生成函数为
问题3
设有n个标志为1,2,…,n的班级,第i个(i=1,2,…n)班级里放有ni个女生。不同班级里的女生是不同的,而同一班级里的女生则是没有差别的,认为是相同的。询问火火后宫从中取r个女生的方案数。
设生成函数
生成函数模板
#include<cstdio>
using namespace std;
int N,g[2][125];
int main(){
while(~scanf("%d",&N)){
for(int i=0;i<=N;++i) g[1][i]=1,g[0][i]=0;
for(int i=2;i<=N;++i){
for(int j=0;j<=N;++j)
for(int k=0;k<=N-j;k+=i) g[i&1][j+k]+=g[1-(i&1)][j];
for(int j=0;j<=N;++j) g[1-(i&1)][j]=0;
}
printf("%d\n",g[N&1][N]);
}
return 0;
}
整数拆分
\(f(x)=(1+x^1+x^2+x^3....+x^n)*(1+x^2+x^4+...)*.....(1+x^n)\)
然后首先数为n的被分数,可以由1,2,3,4,......,n组成,就是不知道选1几个,选2几个。。。
这时候我们可以看一下母函数,设选的数字为i,选的次数为k,那么x的指数可以表示为x^(i*k);
\(就像f(x)中(1+x^1+x^2+x^3....+x^n)表示1不选,1选一次,1选2次....; (1+x^2+x^4+...)表示2不选,2选1次,选2次。。。\)
那么我们要求的分解n的种数就是x^n前的系数(很容易想)。
怎么求x^n的系数呢,多项式相乘解决。
#include <iostream>
#include <string.h>
typedef long long LL;
using namespace std;
int n;
int a[105], b[105];
int main()
{
scanf("%d", &n);
for (int i = 0; i <= n; i++) a[i] = 1;//开始第一个多项式的系数都为1,指数为i
for (int i = 2; i <= n; i++){//i表示选的数
for (int j = 0; j <= n; j++){//k为x的指数,就是选一次i,2次i。。。
for (int k = 0; k + j <= n; k += i){//用另一个数组存储指数为j+k的x的系数,是与前一个多项式相乘
b[j + k] += a[j];
}
}
memcpy(a, b, sizeof(b));
memset(b, 0, sizeof(b));
}
printf("%d\n", a[n]);
return 0;
}
指数型生成函数 (EGF)
OGF 可以用来解决一些无标号组合计数问题,相对地 EGF 可以用来解决一些有标号组合计数问题。
对于一个数列 fn,定义它的指数型生成函数为 F(x)。则:
\(F(x) = \sum_{n \ge 0} \frac{f_n}{n!}x^n\)
基本运算
H(x)=F(x)G(x)
\(\left(\sum_{n \geq 0} \frac {f_{n}}{n!} x^{n}\right)\left(\sum_{n \geq 0} \frac{g_{n}}{n!} x^{n}\right)=\sum_{n \geq 0}\left(\sum_{i=0}^{n} \frac{f_{i} g_{n-i}}{n!}\right) x^{n} = \sum_{n \geq 0} \frac{\sum_{i=0}^{n} f_{i} g_{n-i}}{n!}x^{n}\)
e 相关
\(\begin{aligned} \sum_{n \ge 0} \frac{1}{n!} x^n &= e^x \\ \sum_{n \ge 0} [n \bmod 2 = 0] \frac1{n}x^n &= \frac{e^x + e^{-x}}{2} \\ \sum_{n \ge 0} [n \bmod 2 = 1] \frac1{n}x^n &= \frac{e^x – e^{-x}}{2} \end{aligned}\)

浙公网安备 33010602011771号