前言
对多项式和生成函数的一些学习。
多项式题目
Description
F(j)=i=1∑j−1(i−j)2qi×qj−i=j+1∑n(i−j)2qi×qjE(j)=q(j)F(j)
给定q,求e
Solution
大力推即可。
E(j)=i=1∑j−1(i−j)2qi−i=j+1∑n(i−j)2qi
令f(i)=qi g(i)=i21
即
E(j)=i=0∑jf(i)g(j−i)−i=j∑nf(i)g(i−j)
左边直接卷!
右边根据套路反转,即g′(i)=g(n−i)
=i=j∑nf(i)g′(n−i+j)i=0∑n−jf(i)g′(n−i)
卷!
Description
无标号联通无向图数量。
Solution
设答案为f(n),设g(n)为n个点的无向图数量。
不难发现g(n)=2(2n)
考虑枚举第一个节点所在连通块大小,既有式子
g(n)=i=0∑nf(i)(i−1n−1)g(n−i)
把组合数拆一下。
g(n)g(n)(n−1)!g(n)=i=0∑nf(i)(i−1n−1)g(n−i)=i=0∑nf(i)(i−1)!(n−i)!(n−1)!g(n−i)=i=0∑nf(i)(i−1)!(n−i)!1g(n−i)
看起来没思路了(
但是观察一下发现
(n−1)!g(n)(n−1)!g(n)=i=0∑nf(i)(i−1)!(n−i)!1g(n−i)=i=0∑n(i−1)!f(i)×(n−i)!g(n−i)
每项只和当前相关,后两项还是一个明显的卷积形式。
卷!
Description
通配符字符串匹配问题。
Solution
我们设计一个匹配函数用来进行匹配。
我们假设F(x,y)=a(x)−b(y)为了避免正负符号问题,我们将其平方。
这样两个相同的位置一定是0,否则只要有一个不匹配的,平方后为正数,不符合我们要匹配为0。
因此将通配符的值全变为0。
我们对于一个位置x是否能匹配,发现就是
F(x)=i=0∑m−1(ax−m+i+1−bm−i−1)2ax−m+i+1bm−i−1
用小trick将b反转之后。
F(x)=i=0∑m−1(ax−m+i+1−bi)2ax−m+i+1bi=i=0∑m−1ax−m+i+13brm−i−1+i=0∑m−1brm−i−13ax−m+i+1−2i=0∑m−1ax−m+i+12brm−i−12
卷!
Description
点开吧
Solution
这题多了个扩展匹配。
由于只有ATCG四种碱基,分别考虑。
对可以扩展的位置变成当前考虑的这个字符,跑上面的通配符字符串匹配即可。
对式子进行一番化简。
卷!
Description
经典题呢。
Solution
设对a串增加c,并且已经将b反转后
答案为
=i=1∑n(ai−bi+c)2i=1∑nai2+i=1∑nbi2+2c(i=1∑nai−i=1∑nbi)+nc2−2i=1∑naibi
前面两项固定,后两项是关于c的二次函数求最值。
因此要最大化∑i=1naibi
由于反转,破环成链,再再再利用小trick将b反转之后
卷!
生成函数
定义
生成函数是相对数列而言,一个数列⟨a1,a2,a3...⟩的普通生成函数为F(x)=∑i=0∞aixi
其指数生成函数为G(x)^=∑i=0∞i!aixi
使用生成函数可以有许多美妙的变换。
基本生成函数
⟨1,1,1,1,1...⟩=1−x1⟨1,−1,1,−1...⟩=1+x1⟨1,2,3,4,5...⟩=(1−x)21⟨1,0,1,0,1...⟩=1−x21⟨1,0,...0,1,0,...0,1...⟩=1−xm1⟨1,2,4,8,16,32⟩=1−2x1⟨1,c2,c3,c4...⟩=1−cx1⟨1,(1c),(2c),(3c)...⟩=(1+z)c1⟨1,(1c),−(2c),(3c)...⟩=(1−z)c1⟨1,(1m+1),(2m+2),(3m+3)...⟩=(1−z)m+11⟨0,1,21,21,31...⟩=ln1−z1⟨011,21,−21,31...⟩=ln1+z⟨1,1,21,61,2411201...⟩=ez
指数生成函数
也叫EGF,名字来源于上表最后一个生成函数为⟨1,1,1...⟩的指数生成函数,为ez
下降幂多项式乘法
我们考虑一个多项式的点值的EGF
为
G^(x)=i=0∑∞i!F(i)xi
考虑一个下降幂单项式xn其点值的生成函数为
G^n(x)=i=0∑∞i!inxi=i=0∑∞(i−n)!1xi=i=0∑∞i!xn+i=xni=0∑∞i!xi=xnex
则
G^(x)=i=0∑∞fiG^i(x)=exi=0∑∞fixi=exG(x)
合理!
因此对下降幂求点值只需把他和ex卷一下即可。
生成函数的基本运算
有一些在推式子时会用到的。
以下的生成函数为⟨gn⟩的生成函数
zmG(z)G(cz)G′(z)∫G(z)dtαF(z)+βG(z)=n∑gn−mxn=n∑cngnzn=n∑(n+1)gn+1zn=n∑n1gn−1zn=n∑(αfn+βgn)xn
还非常有用的是对生成函数F(z)=1−z1做卷积,相当于自己的前缀和。
特殊的生成函数
这里建议直接背诵
斐波那契生成函数
F(z)=1−z−z2z
卡特兰数生成函数
C(z)=zC2(z)+1
这个不完全是封闭形式,运用求根公式可以展开。
例题
付公主的背包
Description
有n种物品,每种物品体积为v,每种商品有无数个,求凑出体积为m的方案数。
Solution
这就是生成函数最基本的应用。
显然对于每个物品我们知道他的生成函数长这样
F(x)=i=0∑∞xv×i=1−xv1
暴力来做就把这n个生成函数卷起来就行了。
考虑优化。在麦克劳林级数定义下的ln可以进行正常运算,我们可以把卷积这种复杂度较高的式子优化为加法。
设 G(x)=ln(F(x))
大力推就好了。
G′(x)G′(x)F(x)F′(x)∫G′(x)dx=ln′(F(x))=F(x)F′(x)=F′(x)(1−xv)=i=0∑∞vixvi−1(1−xv)=i=0∑∞vixvi−1−i=0∑∞vixv(i+1)−1=i=1∑∞vixvi−1−i=1∑∞v(i−1)xvi−1=i=1∑∞vxvi−1=G′(x)=i=1∑∞ixvi
答案就是
e∑i=1nG(x)
多项式 exp 即可,总复杂度 O(mlogm)
Description
给定n种节点,每种节点都有一个权值,一棵二叉树的权值为每个节点的权值的和,求权值为1−m的不同的二叉树的数量。
Solution
众所周知,对于无标号无权值的二叉树计数就是卡特兰数。
我们已知卡特兰数的生成函数是
C(x)=xC2(x)+1
其中这个x的每个节点权值都为1,直接做即可,到这道题上,我们可以构造出点集的生成函数,不难发现是
W(x)=i=1∑nxci
映射到数列上就是
⟨1,0,0...1,0,0...1...⟩
的数列,其中间隔的长度是点集中的数的权值。
将 W(x) 带回原先的卡特兰数的式子即可。
答案为
F(x)=W(x)F2(x)+1=2W(x)1−1−4W(x)
关于另一个取+的根,感性理解当limx−>0的时候,取正值为正无穷,因此不能取。
(不过我建议两个都试一下看哪个能过样例。
Description
求给定数列的k阶差分$/5Solution
数列,k阶前缀和,要素察觉。
不难发现求前缀和的数列时答案就是F∗(1−x1)k
这是我们通过已经知道的前缀和生成函数卷出来的结果。
现在考虑在未知差分生成函数的情况下,如何写出其生成函数。
考虑原式的意义。
做一次前缀和,及卷上生成函数F(z)=∑i∞xi
他的数列是⟨1,1,1,1,1,1,1...⟩,相当于对于每一项,向他后面的所有项都贡献当前点的价值。
前缀和就是当前项向后一项贡献当前点的负价值,那么不难发现其生成函数就是F(z)=1−z
在卷一遍即可。
Description
只能做水题人。
Solution
不难发现将四种牌每个的生成函数写出来。
输入的不能取的去掉。
把四个生成函数卷起来就行了/kk