[学习笔记]生成函数
解决数列问题
其实还是一个非常好用的东西
利用x^n占坑。系数表示答案。优化Dp的一个重要手段
1.线性齐次递推
顾名思义
$h_n=a_1*h_{n-1}+a_2*h_{n-2}+...+a_k*h_{n-k}+d_n$
其中$d_n$是关于n的一个多项式
可以递推
可以矩阵乘法
但是
最好不过的是有通项公式!
以下用特征方程来处理出这个通项公式
常系数线性齐次递推
$d_n=0$时,称为:常系数线性齐次递推
有:$h_n-a_1*h_{n-1}+a_2*h_{n-2}+...+a_k*h_{n-k}=0$——①
我们考虑用“等比数列的线性组合”来凑出真正h
定义①的特征方程为:
$x^k-a_1*x^{k-1}+a_2*x^{k-2}+...+a_k=0$
这个方程的k个解,设为g1,g2...gk
①对于每一个根q,${q}^n$都是h的一个可能的通项公式(把$q^{n-k}$)乘回去即可
②对于每一个m重根q,$q^n,nq^n,n^2q^n.....,n^{m-1}q^n$都是h可能的根
证明:
对于$x^n-a_1*x^{n-1}+a_2*x^{n-2}+...+a_k*x^{n-k}=0$——③
因式分解,有$.....(x-q)^m*x^{n-k}=0$
对③求导,再同时乘上x
得到$n*x^n-a_1*(n-1)*x^{n-1}+a_2*(n-2)*x^{n-2}+...+a_k*(n-k)*x^{n-k}=0$——④
考虑因式分解的情况,一定有$(....)(x-q)^{m-1}+(......)(x-q)^m$这样,x=q还是④的解
所以有解:nq^n
重复下去,$q^n,nq^n,n^2q^n.....,n^{m-1}q^n$都是h可能的根
证毕
所以一般来看:
线性组合也即:$h_n=c_1*{g_1}^n+{c_2}*n^m*{g_2}^n...$这样
可以利用前几项待定系数得到
留下个问题:
为什么一定是这两种nq^n,q^n线性组合?
(可以得到的是,如果是线性组合形式,每一个公比一定是一个特征根,否则不能在每一个n都得到0)
非常系数线性齐次递推
叠加原理:
证明:
然后对于一般的题
先求出常系数齐次的部分,
再求出非常系数的部分,然后叠加原理
2.一般生成函数——组合
我们考虑从多项式的角度去处理数列的问题
对于h,g(x)=h0+h1x+h2x^2+...+hn*x^n是一个无穷多项式
这个多项式就叫做h的生成函数
这个x没有什么实际意义
考虑通过x搞一些事情
对于一个1,1,1,1,1,1,1,1,1,1....的序列
生成函数$g(x)=1+x+x^2+....+x^n$
对于|x|<1的时候,后面的项太多可以忽略
可以有:g(x)=1/(1-x)
还是没什么用
实际上,利用|x|非常小的时候,无限的式子可以灵活变成一个有限的式子
然后就可以处理问题了
组合问题
考虑构造一些多项式乘积,使得n次项系数就是$h_n$
也就是构造一个生成函数。
10个限制
高精,还要用NTT优化,
递推问题
把齐次递推直接变成通项公式
就是对于生成函数方程系数的一般化
利用递推公式消掉后面的
分母因式分解
对于g(x)=A/(B*C),A的次数小于B,C
然后可以裂项
再展开就得到了通项公式
大概分母都是(1-px)^m的形式
对于m=1的时候,直接裂项
m!=1的部分,对应特征方程的重根
写成:c1/(1-px)+c2/[(1-px)^2]+....+cm/[(1-px)^m]
解出c即可。
展开就是指数形式了
所以对于之前的疑问也可以证明了
一定都是指数形式的
(知道了这个就不用之前的齐次线性递推也可以做了,非常数好像不行?)
3.指数生成函数——排列(多重集)
就是变了一下形式
令g的指数生成函数为:
$g^{(e)}(x)=1+h_1*\frac{x}{1!}+h_2*\frac{x^2}{2!}+.....+h_n*\frac{x^n}{n!}$
一些性质:
$h_i=1$时,
$1+\frac{x}{1!}+\frac{x^2}{2!}+.....+\frac{x^n}{n!}=e^x$
那么有推论:
$e^{ax}$所代表的数列是:
$1,a,a^2,a^3,...,a^n$
相对于组合数
就是多了阶乘一步,使得多重集合的排列n!/(e1!*e2!...)能够凑出来
得到的系数再乘上n!就是实际的答案
就是这里就要用e来搞一搞了
POJ3734
列出式子
得到的每一项的系数是∑1/(Πei!)
再乘n!就是答案
充分利用:
$1+\frac{x}{1!}+\frac{x^2}{2!}+.....+\frac{x^n}{n!}=e^x$
把1,-1带进去,再做和再除以2,得到偶数项的和
然后再拆开
考虑$e^{4x},2*e^{2x}$对应的数列
再乘上n!
分着拆开,后面的+1特判一下
感觉生成函数就是
首先这是一个在排列组合意义下,或者在递推公式中找通项公式的办法。
1.根据排列还是组合先分两种
2.先列出式子,使得系数和答案有关
3.把无穷项合并
4.把有限项再分着拆开。使得,拆开后的每一项的系数是有通项公式可循
5.根据系数和通项公式的关系得到通项公式
4.卷积生成函数
先咕咕着
有些题推出来的式子不会这么直接
往往带有很多别的低阶多项式
往往还涉及到求根公式和开根
就是求根,然后处理根号,求导
求出G(x)的递推式,再求出F(x)的递推式。
关键是消去根号和分数线
upda:2019.5.6
小技巧
A
不断求导可以配出$i^k$系数,每次多乘一个x,再求导,最后只会少了$a_0$
B
如果推出形如:$\frac{p(x)}{q(x)}=A(x)$要求$A(x)$的递推式,其中p是n次项,q是m次项。
则$A(x)*q(x)=p(x)$利用卷积,关注$[x^n]p(x)=[x^{n-m}]A(x)*[x^m]q(x)$即可得到$a_{n-m}$,然后下顺,即可依次得到$a_{n-m-1},a_{n-m-2}...$
C
$\frac{P(x)}{\Pi (x-a_i)^{k_i}}$化成部分分式:$\sum \frac{P_i(x)}{(x-a_i)^{k_i}}$
直接通分,分子之和等于$P(x)$
即:$P(x)=\sum P_i(x)\times \Pi_{j!=i}(x-a_j)^{k_j}$
不妨考虑$mod\space (x-a_i)^{k_i}$
可以得到:$P(x)=P_i(x)\times \Pi_{j!=i}(x-a_j)^{k_j}\space mod\space (x-a_i)^{k_i} $
考虑进行分治处理:类似多点求值,进入左半边的时候,整体$mod\space \Pi_{j>mid}(x-a_j)^{k_j} $
至于还需要:$\Pi_{j!=i}(x-a_j)^{k_j}$还是类似分治
再来一个多项式求逆即可得到:$Pi(x)$
用处:可以继续化简$ \frac{P_i(x)}{(x-a_i)^{k_i}}=\sum_{j=1}^{k_i} \frac{b_j}{(x-a_i)^{j}}$
分子是一个常数,分母可以直接展开,获得这一项的O(1)公式。求通项的时候,分别对这$\sum k_i$个的第$[x^n]$进行求和。O(k)求一项。胜过无脑快速递推的O(klogk)
D
$w^{i\times (n-i)}=w^{(C(n,2)-C(i,2)-C(n-i,2))}$然后除过去和n有关的。