洛必达法则
若函数f和g满足以下条件:
- x→x0limf(x)=x→x0limg(x)=0;
- 在x的某空邻域U∘(x0)内两者均可导,且g′(x)=0;
- x→x0limg′(x)f′(x)=A,其中A可为非正常极限。
则
x→x0limg(x)f(x)=x→x0limg′(x)f′(x)=A
通俗地说,如果f(x),g(x)在x0处的极限都是0,那么g(x)f(x)在x0处的极限可以通过他们的导数来求。
多项式除法
给出多项式A(x),B(x),求出D(x),R(x),满足A(x)=B(x)Q(x)+R(x),且degR<degB。注意这里不是模意义下。degA表示多项式最高次项的次数。
定义一个变换
FR(x)=xdegFF(x1)
该变换的实质是把多项式的系数翻转过来了。代入x1得到
A(x1)=B(x1)Q(x1)+R(x1)
由于degQ=degA−degB,那么不妨设degR=degB−1。稍作变换得到
xdegAA(x1)AR(x)=xdegBB(x1)xdegQQ(x1)+xdegAR(x1)=BR(x)QR(x)+RR(x)xdegA−degB+1
那么容易发现,在模xdegA−degB+1意义下,RR就没了:
AR(x)=BR(x)QR(x)(modxdegA−degB+1)
这样我们可以求出QRmodxdegA−degB+1。
由于degQ<degA−degB+1,因此QRmodxdegA−degB+1=QR。于是
QR(x)=BR(x)AR(x)(modxdegA−degB+1)
这样使用多项式求逆即可得到QR,反代回去可求出R。
时间复杂度O(nlog2n)。
多点求值
给出F(x),求F(a1),F(a2),⋯,F(am),其中m与degF同阶。
考虑分治。设L(x)=∏i=1⌊2m⌋(x−ai),R(x)=∏i=⌊2m⌋+1n(x−ai)。
容易发现L(a1)=L(a2)=⋯=L(a⌊2m⌋)=0。那么构造FL(x)=F(x)modL(x)。显然有FL(ai)=F(ai),i∈[1,⌊2m⌋]满足。因此左边递归下去求值。右边同理。
时间复杂度O(mlog22m)。在实现的过程中需要预先把所有的∏(x−ai)函数都存下来,因此空间复杂度是O(mlog2m)。
快速插值
给出(x1,y1),(x2,y2),⋯,(xn,yn)。那么我们可以唯一确定一个n−1次多项式。求出这个多项式。
用拉格朗日插值可以得到
F(x)=i=1∑nj=i∏(xi−xj)(x−xj)yi=i=1∑n∏j=i(xi−xj)∏j=i(x−xj)yi
分上下两部分处理。
第一部分
考虑对于每个i求出Vi=∏j=i(xi−xj)。
设M(x)=∏i=1n(x−xi)。那么M(x)可以分治 NTT 计算出来,时间复杂度O(nlog2n)。
容易发现Vi=x−xiM(x)。但是如果我们直接做n次多项式求逆的话复杂度就不对了。
利用洛必达法则,设Q(x)=x−xi。因为M(xi)=Q(xi)=0,且两个函数都在邻域内可导,因此得到
Vi=Q(x)M(x)(xi)=Q′(x)M′(x)(xi)=M′(xi)
那么对M′(x)求出在x1,x2,⋯,xn处的点值即可。这样就求出了所有Vi。时间复杂度O(nlog22n)。
第二部分
求出Vi后,原式可以表示为
F(x)=i=1∑nViyij=i∏(x−xj)
同样考虑分治,设
MLMRFLFR=i=1∏n/2(x−xi)=i=n/2+1∏n(x−xi)=i=1∑n/2Viyij=1,j=i∏n/2(x−xj)=i=n/2+1∑nViyij=n/2+1,j=i∏n(x−xj)
那么如果我们求出了这 4 个多项式,那么可以得到F=FLMR+FRML。两边递归求解即可。
时间复杂度O(nlog22n),空间复杂度O(nlog2n),因为多点求值带一个O(nlog2n)的空间复杂度。而第二部分的计算是可以把空间减小到O(n)的,不过直接动态开空间也只增大了空间常数,没有改变空间复杂度。
多项式复合逆
对于两个多项式函数F(x),G(x),如果F(G(x))=x,称F,G互为复合逆。
容易证明G(F(x))=F(G(x))=x。但是多项式复合逆没有时间复杂度O(nlog2n)的做法。但可以使用拉格朗日反演在O(nlog2n)的时间内计算出某一项。
拉格朗日反演
对于两个多项式函数F(x),G(x),如果F(G(x))=x,那么
[xn]G(x)=n1[xn−1](F(x)x)n
还有一个扩展形式:
[xn]H(G(x))=n1[xn−1]H′(x)(F(x)x)n
其中H(x)是另一个多项式函数。
大朋友与多叉树
题意:求有多少棵有根树,满足有s个叶子结点,内部结点的儿子数都属于集合D,且1∈/D。注意,儿子之间是有顺序的。
例如当s=4,D={2,3}时:

定义两个普通生成函数
F(x)=n∈D∑xnG(x)=n≥1∑gnxn
其中gn是s=n的答案。考虑根结点的孩子数为a,此时方案数的生成函数显然为Ga(x)。从这个思路出发,可以得到
F(G(x))+x=G(x)
加上一个x是考虑s=1的情况。可以得到G(x)−F(G(x))=x,因此x−F(x)与G(x)互为复合逆。
使用拉格朗日反演得到
[xs]G(x)=s1[xs−1](x−F(x)x)s
在模xs+1意义下直接求值即可。一个技巧是把后面的式子转化为(1−xF(x))−s的形式,这样常数项为 1,可以多项式ln来求幂。
时间复杂度O(nlog2n)。
仙人掌计数
仙人掌:如果一个简单无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌。所谓简单环即不经过重复的结点的环。
求n个点带标号的仙人掌数量。
考虑有根仙人掌的指数生成函数为F(x)。那么求出来后把方案数除以n就是答案。我们可以将仙人掌的构成分成两种部分:
- 从根结点连出去的独立边,相当于接一个仙人掌出去。一条边连出去的生成函数是F(x),多条边之间不区分顺序,因此方案数是expF(x)。
- 包含根结点的一个简单环,环上除了根结点之外的每个结点都挂一个仙人掌。由于我们要考虑环上结点之间的顺序,因此假设环长为i+1,那么i个仙人掌按序排列的生成函数是Fi(x)。考虑到是一个环,因此每个排列被正着反着各算了一次,因此长度为i+1的环的生成函数是2Fi(x)。那么一个环的生成函数就是i≥2∑2Fi(x)。多个环之间是不区分顺序的,因此多个环的方案数是exp(i≥2∑2Fi(x))。
综上,环和独立边互不相关,总方案数是exp(F(x)+i≥2∑2Fi(x)),再加上根结点本身得到
F(x)=xexp(F(x)+i≥2∑2Fi(x))
稍作整理得到
F(x)=xexp(2−2F(x)2F(x)−F2(x))
考虑牛顿迭代法。
方法一
设
G(F(x))=xexp(2−2F(x)2F(x)−F2(x))−F(x)
那么显然我们要求G(F(x))=0(modxn+1)。应用牛顿迭代得到
F(x)=F0(x)−G′(F0(x))G(F0(x))(modxn)
对G求导得到
G′(F(x))=(xexp(2−2F(x)2F(x)−F2(x)))′−1=x(exp(2−2F(x)2F(x)−F2(x)))′−1=xexp(2−2F(x)2F(x)−F2(x))(2−2F(x)2F(x)−F2(x))′−1=xexp(2−2F(x)2F(x)−F2(x))(1+(2−2F(x))22(2F(x)−F2(x)))−1
如何理解式子中的x?我们把它理解为与F(x)不相关的一个常量即可。常量的导数是0。
最后得到
F(x)=F0(x)−xexp(2−2F0(x)2F0(x)−F02(x))(1+(2−2F0(x))22(2F0(x)−F02(x)))−1xexp(2−2F0(x)2F0(x)−F02(x))−F0(x)(modxn)
方法二
方才F(x)的式子可以变换为
F(x)=xexp(2−2F(x)2F(x)−F2(x))F(x)exp(2F(x)−22F(x)−F2(x))−x=0
因此设
G(F(x))=F(x)exp(2F(x)−22F(x)−F2(x))−x
同样的方法,对G求导得到
G′(F(x))=exp(2F(x)−22F(x)−F(x)2)(1−F(x)(1+(2F(x)−2)22(2F(x)−F(x)2)))
因此可以得到
F(x)=F0(x)−exp(2F0(x)−22F0(x)−F0(x)2)(1−F0(x)(1+(2F0(x)−2)22(2F0(x)−F0(x)2)))F0(x)exp(2F0(x)−22F0(x)−F02(x))−x=F0(x)−1−F0(x)(1+(2−2F0(x))22(2F0(x)−F0(x)2))F0(x)−xexp(2−2F0(x)2F0(x)−F02(x))(modxn)
两种迭代方式是等价的。由于是 EGF 最后别忘了乘上n!。
代码
点双连通图计数
如果一个无向连通图删去任意一个点都仍然是连通的,我们就称为点双连通图。
求n个点带标号点双连通图的个数。
同样地,设F(x)=∑n≥1fnn!xn表示n个点的点双连通图的 EGF。设G(x)表示n个点有根连通图的 EGF。
设H(x)=∑n≥02(2n)n!xn表示带标号无向图数的生成函数,那么得到G(x)=x(lnH(x))′。
我们考虑用F表示G。考虑有根无向图的包含根结点的点双连通分量。假设大小为i+1,那么除了根结点之外的点都可以挂一个有根连通图,因此方案数是∑i≥1i!Gi(x)。对于i个不区分顺序的有根连通图的根结点,再加上根结点,因此一个点双连通分量的方案数是∑i≥1i!fi+1Gi(x)。多个点双连通分量之间不区分顺序,因此总方案数是exp(∑i≥1i!fi+1Gi(x))。再加上根结点本身得到
G(x)=xexp(i≥1∑i!fi+1Gi(x))=xexpF′(G(x))
然而这个方程无法牛顿迭代。设G的复合逆是GI,那么得到
G(GI(x))xF′(x)=GI(x)expF′(G(GI(x)))=GI(x)expF′(x)=lnGI(x)x
据说使用扩展拉格朗日反演可以解决。