[学习笔记]生成函数

解决数列问题

其实还是一个非常好用的东西

利用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有关的。

posted @ 2019-01-26 19:04  *Miracle*  阅读(1420)  评论(0编辑  收藏  举报