生成函数

157 篇文章 0 订阅
37 篇文章 1 订阅

1.普通生成函数 OGF \texttt{OGF} OGF
对于无顺序的计数
f ( x ) = ∑ i = 0 a i x i f(x) = \sum_{i=0} a_ix^i f(x)=i=0aixi
这里的 x x x是形式幂级数,我们不关心 x x x的具体取值,我们只关心系数,可以通过复分析证明可以无视收敛条件化简: ∑ i = 0 x i = 1 1 − x \sum_{i=0} x^i = \frac 1{1-x} i=0xi=1x1

Ex1   :   求出   Ai   =   i*i   的生成函数 \texttt{Ex1 : 求出 Ai = i*i 的生成函数} Ex1 : 求出 Ai = i*i 的生成函数
考虑 f ( x ) = ∑ i = 0 i x i = ∑ i = 1 x i ∑ j = 0 x j = x 1 − x ⋅ 1 1 − x f(x) = \sum_{i=0} ix^i = \sum_{i=1}x^i\sum_{j=0}x^j = \frac x{1-x} \cdot\frac 1{1-x} f(x)=i=0ixi=i=1xij=0xj=1xx1x1
∴ A ( x ) = ∑ i = 0 i ∗ i x i = ∑ i = 0 ( i − 1 ) i x i + i x i = x ( 1 − x ) 2 + ∑ i = 2 x i ∑ j = 0 j x j = x ( 1 − x ) 2 + x 2 1 − x ⋅ x ( 1 − x ) 2 = x 3 − x 2 + x ( 1 − x ) 3 \therefore A(x) = \sum_{i=0} i*ix^i = \sum_{i=0} (i-1)ix^i + ix^i \\= \frac x{(1-x)^2} + \sum_{i=2} x^i\sum_{j=0}jx^j \\=\frac x{(1-x)^2} + \frac {x^2}{1-x} \cdot \frac x{(1-x)^2} = \frac {x^3-x^2+x}{(1-x)^3} A(x)=i=0iixi=i=0(i1)ixi+ixi=(1x)2x+i=2xij=0jxj=(1x)2x+1xx2(1x)2x=(1x)3x3x2+x

A n = 2 n x n A_n=2^nx^n An=2nxn的生成函数: 1 1 − 2 x \frac 1{1-2x} 12x1
A = { 1 , 0 , 1 , 0 , . . . . } A=\{1,0,1,0,....\} A={1,0,1,0,....} 1 1 − x 2 \frac 1{1-x^2} 1x21
A = { 0 , 1 , 0 , 1 , . . . . } A=\{0,1,0,1,....\} A={0,1,0,1,....} x 1 − x 2 \frac x{1-x^2} 1x2x
A i = i − 1 A_i=i-1 Ai=i1的生成函数: d ( 1 1 − x ) d x = 1 ( 1 − x ) 2 \frac {\mathrm d(\frac 1{1-x})}{\mathrm d x}=\frac 1{(1-x)^2} dxd(1x1)=(1x)21

2.指数生成函数
对于有顺序的计数。
f ( x ) = ∑ i = 0 a i x i i ! f(x) = \sum_{i=0} \frac {a_ix^i}{i!} f(x)=i=0i!aixi
卷积时自带排列。

A i = i ! A_i=i! Ai=i!的指数生成函数: P ( x ) = 1 1 − x P(x) = \frac 1{1-x} P(x)=1x1
A i = ( i − 1 ) ! A_i=(i-1)! Ai=(i1)!的指数生成函数: C ( x ) = ln ⁡ 1 1 − x C(x) = \ln\frac {1}{1-x} C(x)=ln1x1
P ( x ) = e C ( x ) P(x) = e^{C(x)} P(x)=eC(x)
组合意义,排列(置换)可以分解成多个环排列。
错排方案数: D ( x ) = e C ( x ) − x = e − x 1 − x D(x) = e^{C(x)-x}=\frac {e^{-x}}{1-x} D(x)=eC(x)x=1xex,即多个没有自环的环排列。

关于多项式 e x p ( F ( x ) ) exp(F(x)) exp(F(x))的意义,其中 F ( x ) = ∑ i f i x i i ! F(x) = \sum_{i} f_i\frac {x^i}{i!} F(x)=ifii!xi
f i f_i fi是有标号的计数。
G ( x ) = e x p ( F ( x ) ) = ∑ i F ( x ) i i ! G(x) = exp(F(x)) = \sum_{i} \frac{F(x)^i}{i!} G(x)=exp(F(x))=ii!F(x)i
得出来的 G ( x ) = ∑ i g i x i i ! G(x)=\sum_{i} g_i\frac {x^i}{i!} G(x)=igii!xi中, g i g_i gi也是有标号的计数。
那么 e x p exp exp中相当于 把 n n n个标号分到 n n n个点但是这 n n n个点分成了 i i i个集合,每个集合内部的标号方案被 F ( x ) F(x) F(x)限定住了,所以每个集合的点可以看作一样的点, n n n个点但是有相同颜色的点,给这些点分配标号。
F ( x ) i i ! \frac{F(x)^i}{i!} i!F(x)i相当于提取出来把 n n n个点分成 i i i个集合,标号已经被上面的所述的指数函数的性质统计了,那么这 i i i个集合实际上是没有顺序限制的,但是 F ( x ) i F(x)^i F(x)i中是有顺序限制的(注意到因为要分配标号,所以 F ( x ) F(x) F(x)中相同的两种分配标号方式在这一步是不同的),直接除上 i ! i! i!

3.FFT
4.循环卷积。
5.二维循环卷积
参考多维 DFT \texttt{DFT} DFT

6.bluestein算法
https://blog.csdn.net/outer_form/article/details/52386685
计算n位循环卷积的方法。

( m o d 1163962801 ) \pmod{1163962801} (mod1163962801)
这是1~22的 l c m lcm lcm,他有2到22次单位根,可以直接在模意义下的环内用整数做 DFT \texttt{DFT} DFT

7.单位根反演。
我博客里有。

一个图中,求走过步数i为 K K K的倍数的路径的 ( n i ) \binom{n}{i} (in)之和。
首先可以让每个点连一个自环,那么长度为i的路径到n时就会选择n-i个时刻走自环,那么就可以解决这个组合数了。
然后直接上单位根反演,把走一步后乘上 w n i , i ∈ [ 0 , K − 1 ] w_n^i,i\in[0,K-1] wni,i[0,K1] 加起来除以 K K K就行了。

其实也可以矩阵中每个元素维护一个 K − 1 K-1 K1次多项式,然后做长度为 K K K的循环卷积,最后插值回去,并无大差异。

8.Polya生成函数
有一个长度为 n n n的项链, m m m种颜色。
求对于颜色 i i i用了 C i C_i Ci个的在旋转置换下的等价类数。
对于置换(移动 p p p位)的不动点的生成函数: f p ( x 1 , x 2 , x 3 . . x m ) = ( ∑ i = 1 m x i g c d ( p , n ) ) n g c d ( p , n ) f_p(x_1,x_2,x_3..x_m) = (\sum_{i=1}^m x_i^{gcd(p,n)})^{\frac n{gcd(p,n)}} fp(x1,x2,x3..xm)=(i=1mxigcd(p,n))gcd(p,n)n
对于等价类的生成函数: F ( x 1 , x 2 . . . . x m ) = ∑ p f p ( x 1 , x 2 . . . x m ) n F(x_1,x_2....x_m) = \frac {\sum_p f_p(x_1,x_2...x_m)}n F(x1,x2....xm)=npfp(x1,x2...xm)
算就是了。

9.多项式可以执行的操作
Ⅰ:多项式牛顿迭代:
对于 f ( x ) f(x) f(x)展开一阶即认为 f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ∗ ( x − x 0 ) f(x) = f(x_0) + f'(x_0) * (x-x_0) f(x)=f(x0)+f(x0)(xx0)
然后求 f ( x ) = 0 f(x) = 0 f(x)=0 x x x的解。
x = f ′ ( x 0 ) − f ( x 0 ) f ′ ( x 0 ) x = f'(x_0) - \frac {f(x_0)}{f'(x_0)} x=f(x0)f(x0)f(x0)
不断用 x 0 x_0 x0求出新的 x x x,把 x 0 = x x_0 = x x0=x,如果 f ( x ) = 0 f(x)= 0 f(x)=0则结束。
对于多项式我们来抽象的实现牛顿迭代。
A ( x ) = f ′ ( B ( x ) ) − f ( B ( x ) ) f ′ ( B ( x ) ) A(x) = f'(B(x)) - \frac {f(B(x))}{f'(B(x))} A(x)=f(B(x))f(B(x))f(B(x))
每次多项式长度都会*2.
Ⅱ:多项式求逆:
A ( x ) = 1 B ( x ) A(x) = \frac 1{B(x)} A(x)=B(x)1
注意把 A ( x ) − 1 B ( x ) = 0 A(x) - \frac 1{B(x)} = 0 A(x)B(x)1=0牛顿迭代是有坑点的,需要特殊理解。
ⅠⅠⅠ:多项式除法。
A ( x ) = B ( x ) C ( x ) + D ( x ) A(x) = B(x)C(x) + D(x) A(x)=B(x)C(x)+D(x)
A ( 1 x ) = B ( 1 x ) C ( 1 x ) + D ( 1 x ) A(\frac 1x) = B(\frac 1x)C(\frac 1x) + D(\frac 1x) A(x1)=B(x1)C(x1)+D(x1)
x d e g ( A ) A ( 1 x ) = x d e g ( B ) B ( 1 x ) x d e g ( C ) C ( 1 x ) + x d e g ( A ) D ( 1 x ) x^{deg(A)} A(\frac 1x) = x^{deg(B)}B(\frac 1x)x^{deg(C)}C(\frac 1x) + x^{deg(A)}D(\frac 1x) xdeg(A)A(x1)=xdeg(B)B(x1)xdeg(C)C(x1)+xdeg(A)D(x1)
最后一项因为 d e g ( D ) < d e g ( B ) deg(D) < deg(B) deg(D)<deg(B)所以在 ( m o d x d e g ( A ) − d e g ( B ) + 1 ) \pmod {x^{deg(A)-deg(B)+1}} (modxdeg(A)deg(B)+1)的意义下是0.
对于A,B,C都只相当于把多项式的系数反转。
那么就可以算出C,然后算出 D D D.
Ⅳ:多项式多点求值:
对于 f ( x ) =   s u m i = 0 n a i x i f(x)= \ sum_{i=0}^n a_ix^i f(x)= sumi=0naixi f ( x 1 ) , f ( x 2 ) . . . f ( x m ) f(x_1),f(x_2)...f(x_m) f(x1),f(x2)...f(xm)
设一个多项式 π ( i , j ) = ∏ i j ( x − x i ) \pi(i,j) = \prod_{i}^j (x-x_i) π(i,j)=ij(xxi)
f ( x ) ≡ g ( x ) ( m o d π ( 1 , k ) ) f(x) \equiv g(x) \pmod{\pi(1,k)} f(x)g(x)(modπ(1,k))
所以因为 f ( x i ) = f ( x ) ( m o d x − x i ) = g ( x i ) f(x_i) = f(x) \pmod {x-x_i} = g(x_i) f(xi)=f(x)(modxxi)=g(xi)
这样就可以类线段树分治,每次两个多项式取模把多项式次数减半。
V:多项式快速插值
用多项式科技优化拉格朗日插值。
发现可以直接分治,左半插值,右半插值, f l , r = f l , m i d π m i d + 1 , r + f m i d + 1 , r π l , m i d f_{l,r} = f_{l,mid}\pi_{mid+1,r} + f_{mid+1,r}\pi_{l,mid} fl,r=fl,midπmid+1,r+fmid+1,rπl,mid ,两个 log ⁡ \log log美滋滋。但是初值需要知道 y i = F ( x i ) ∏ j ! = i ( x i − x j ) y_i = \frac {F(x_i)}{\prod_{j!=i} (x_i-x_j)} yi=j!=i(xixj)F(xi)
P i ( x ) = ∏ j ( x − x j ) ( x − x i ) P_i(x) = \frac {\prod_j(x-x_j)}{(x-x_i)} Pi(x)=(xxi)j(xxj)
那么 y i = F ( x i ) P i ( x i ) y_i = \frac {F(x_i)}{P_i(x_i)} yi=Pi(xi)F(xi)
那么我们就需要算出 P i ( x i ) P_i(x_i) Pi(xi)
以小学生的素养知道分母为0 ,再用小学生就应该会的微积分中的洛必达法则得出 P i ( x i ) = ( ∏ j ( x − x j ) ) ′ − x i P_i(x_i) = \frac {(\prod_j(x-x_j))'}{-x_i} Pi(xi)=xi(j(xxj))
对分子多项式多点求值就行了。
E x 1 : 分 拆 数 Ex1:分拆数 Ex1:
求对于 n n n的不下降可重分拆方案数。
不是五边形数的那个!!!!
推式子后 e x p exp exp
注意EGF的组合意义不要乱用。


开始线代?
范德蒙德矩阵
它的行列式 ∏ j < i ( x i − x j ) \prod_{j<i} (x_i-x_j) j<i(xixj)可以用巧妙一下用多点求值。

Ex2 \texttt{Ex2} Ex2
给出 f ( x ) = ∏ i = 0 n ( 1 − a i x i ) f(x) = \prod_{i=0}^n (1-a_ix^i) f(x)=i=0n(1aixi), g ( x ) = ∏ i = 0 n ( 1 − b i x i ) g(x) = \prod_{i=0}^n (1-b_ix^i) g(x)=i=0n(1bixi)
h ( x ) = ∏ i = 0 n ∏ j = 0 n ( 1 − a i b j x i + j ) h(x) = \prod_{i=0}^n\prod_{j=0}^n (1-a_ib_jx^{i+j}) h(x)=i=0nj=0n(1aibjxi+j)
泰勒展开 l n ( f ( x ) ) = ∑ k > 0 ( − 1 ) k − 1 k x k ( ∑ i = 0 n a i k ) ln(f(x)) = \sum_{k>0} \frac {(-1)^{k-1}}{k}x^k(\sum_{i=0}^na_i^k) ln(f(x))=k>0k(1)k1xk(i=0naik)
l n ( h ( x ) ) = ∑ k > 0 ( − 1 ) k − 1 k x k ( ∑ i = 0 n ∑ j = 0 n a i k b j k ) ln(h(x)) = \sum_{k>0} \frac {(-1)^{k-1}}kx^k(\sum_{i=0}^n\sum_{j=0}^na_i^kb_j^k) ln(h(x))=k>0k(1)k1xk(i=0nj=0naikbjk)
解出 ∑ i = 0 n a i k \sum_{i=0}^na_i^k i=0naik, ∑ i = 0 n b i k \sum_{i=0}^nb_i^k i=0nbik就可以直接推出 ln ⁡ ( h ( x ) ) \ln(h(x)) ln(h(x))

常系数线性递推。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值