生成函数GeneratingFunction
生成函数GeneratingFunction
极限
\(\forall \rightarrow\)对于
\(\exists \rightarrow\)存在
极限:\(\forall \epsilon,\exists N,N>n,|a_n-A|<\epsilon\)
就是说,对于所有(任意小的非负整数)\(\epsilon\)存在\(N\),使得\(a_n\)与A的差值小于\(\epsilon\)
我们就把\(A\)叫做此序列的极限\(\lim_{n\rightarrow\infty}a_n=A\)
有限数列没有极限!
若数列中的值全部相同的也没有极限!
\(\{1,\frac{1}{2},\frac{1}{3},\frac{1}{4},...\}的极限是0\)
\(\{1,0,0,0,0,0,...\}\)的极限是0
导数
To be continued:D
泰勒公式
To be continued:D
生成函数
如何简短的表示一个序列呢?
\(\left\{1,1,1,1,1,1,1,...\right\}\)
我们以一多项式来表达,以x的指数为下标,系数为值,就可以得到
\(A=\left\{1*x^0,1*x^1,1*x^2,1*x^3,...\right\}\)
即
\(A=\left\{1,x,x^2,x^3,...\right\}\)
注意,这个序列的长度是无限的
\(\frac{1}{1-x}\)就是生成这个序列的函数,也就是说,它就是生成函数
类似的,可以得到:
当然,生成函数支持加法和乘法(上面已经有例子了)
还有
如何生成有限数列呢?
如果对生成函数求导会如何?
这里旨在于告诉你很多数列均可以用生成函数表示
此外的
当然,普通生成函数的用处不止于此
有一些水果,求选苹果偶数个,选梨5的倍数个,橘不超过4个,桃最多一个,求选共n个水果的方案数
这咋办?还好,我们有生成函数!
众所周知,普通生成函数的乘积就是组合数(你又知道?)
我们让i次项系数作为组合数\[C=A+B=\sum_{n=0}^\infty(a_i+b_i)x_n \rightarrow 加法原则\\ C=A\times B=\sum_{n=0}^\infty\sum_{i=0}^{n}(a_i*b_{(n-i)})x_n\\ c_n=\sum_{i=0}^{n}(a_i*b_{(n-i)})x_n \rightarrow 乘法原则 \]故得\(i\)次项系数即为相加为i的生成函数的所有方案数
苹果的生成函数:\(1+x^2+x^4+x^6+...=\frac{1}{1-x^2}\)
梨:\(1+x^5+x^{10}+...=\frac{1}{1-x^5}\)
橘:\(1+x+x^2+x^3+x^4=\frac{1-x^5}{1-x}\)
桃:\(1+x=\frac{1-x^2}{1-x}\)
相乘求组合,\(\frac{1}{1-x^2}\times\frac{1}{1-x^5}\times\frac{1-x^5}{1-x}\times\frac{1-x^2}{1-x}=\frac{1}{(1-x)^2}\)
发现恰为\(1+2x+3x^2+4x^4+...\)所以输出n即可
6!
但是,并不是所有题目都如此凑巧,我们还得算\((1+x^2+x^4+x^6+...)\times(1+x^5+x^{10}+...)\times ...\)
所以,我们将给出一个模板,旨在于做\(\uparrow\)上面的小乘法
//这里是一个用背包装物品的模板
c1[0]=1,l1=0;
//x[i]-->物品大小
//y[i]-->物品个数
for (int i = 1; i <= n; i++)//遍历物品
{
l2 = l1 + x[i] * y[i];//预计的最高次数
memset(c2, 0, sizeof(int) * (l2 + 1));//清空
for (int j = 0; j <= y[i] && j * x[i] <= l2; j++)
//当然,如果物品无限多不需要判断j <= y[i]
for (int k = 0; k <= l1 && j * x[i] + k <= l2; k++)
c2[j * x[i] + k] += c1[k];
memcpy(c1, c2, sizeof(int) * (l2 + 1));//储存计算结果
l1 = l2;
}
//最后,c1[n]表示装满大小k的背包的方案数
其实,看到这你也能发现,它可以用背包实现,但与背包相比,生成函数可快多了
普通生成函数只能解决组合问题!!!
指数生成函数
普通生成函数只能解决组合问题!!!
但是指数生成函数可以解决排列问题:D
To be continued:D