【总结】一般生成函数(OGF)&指数生成函数(EGF)&生成函数计数

介绍一些简单的概念和计数题

文章目录

  • 生成函数概念
    • 一般生成函数(OGF)
    • 指数生成函数(EGF)
    • 关系
  • 生成函数计数
    • 生成序列与集合
    • 置换计数
    • 背包计数
  • 例题
        • BZOJ3625 小朋友和二叉树
        • BZOJ 3456:城市规划
        • BZOJ4228 Tibbar 的后花园


生成函数概念


一般生成函数(OGF)

考虑一类组合对象组成的集合 A A A,对于集合中的每个元素 a a a定义其大小为 ∣ a ∣ |a| a(非负整数),设大小为 n n n的元素个数为 A n A_n An(所有 A n A_n An都是有限的)。

定义
A = ∑ i = 0 ∞ A i x i A=\sum\limits_{i=0}^{\infty} A_ix^i A=i=0Aixi
A A A的一般生成函数。

指数生成函数(EGF)

对于带标号组合对象组成的集合 A,定义
A = ∑ i = 0 ∞ A i i ! x i A=\sum\limits_{i=0}^{\infty}\dfrac{A_i}{i!}x^i A=i=0i!Aixi
A A A的指数生成函数。


关系

拼接两个对象 a , b a,b a,b
对于一般生成函数,方案唯一。
对于指数生成函数,由于集合中元素是带标号的, a , b a,b a,b拼接起来时只需保证拼接对象内部相对标号不变,方案数为 ( ∣ a ∣ + ∣ b ∣ ) ! ∣ a ∣ ! ∣ b ∣ ! \dfrac{(|a|+|b|)!}{|a|!|b|!} a!b!(a+b)!

普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题。


生成函数计数


生成序列与集合

生成序列:
s e q ( A ) = ∑ i = 0 ∞ A i = 1 1 − A seq(A)=\sum\limits_{i=0}^{\infty}A^i=\dfrac{1}{1-A} seq(A)=i=0Ai=1A1
生成集合:
s e t ( A ) = ∑ i = 0 ∞ A i i ! = e A set(A)=\sum\limits_{i=0}^{\infty}\dfrac{A^i}{i!}=e^A set(A)=i=0i!Ai=eA


置换计数

k k k轮换有 ( k − 1 ) ! (k-1)! (k1)!个, E G F EGF EGF: ( k − 1 ) ! k ! x k = x k k \dfrac{(k-1)!}{k!}x^k=\dfrac{x^k}{k} k!(k1)!xk=kxk
所有轮换的 E G F EGF EGF:
∑ i = 0 ∞ x i i = − ln ⁡ ( 1 − x ) \sum\limits_{i=0}^{\infty} \dfrac{x^i}{i}=-\ln(1-x) i=0ixi=ln(1x)

故所有置换的 E G F EGF EGF
e − ln ⁡ ( 1 − x ) = 1 1 − x e^{-\ln(1-x)}=\dfrac 1{1-x} eln(1x)=1x1
n n n置换的方案数为 n ! n! n!


背包计数

例:有 ∑ i = 1 n a i \sum\limits_{i=1}^n a_i i=1nai种物品,体积为 i i i的物品有 a i a_i ai种。每种物品有无限个。

O ( n log ⁡ n ) O(n\log n) O(nlogn)求解背包。
∏ i = 1 n ( 1 1 − x i ) a i \prod\limits_{i=1}^n(\dfrac{1}{1-x^i})^{a_i} i=1n(1xi1)ai

套路转换为:
exp ⁡ ( − ∑ i = 1 n a i ln ⁡ ( 1 − x i ) ) \quad \exp(-\sum\limits_{i=1}^n a_i\ln(1-x^i)) exp(i=1nailn(1xi))
= exp ⁡ ( ∑ i = 1 n a i ∑ j ≥ 1 x i j j ) =\exp(\sum\limits_{i=1}^n a_i\sum\limits_{j\geq 1} \dfrac{x^{ij}}j) =exp(i=1naij1jxij)
= exp ⁡ ( ∑ j ≥ 1 1 j A ( x j ) ) =\exp(\sum\limits_{j\geq 1} \dfrac{1}jA(x^j)) =exp(j1j1A(xj))

A ( x j ) A(x^j) A(xj)只有 n j \dfrac nj jn项有用,调和级数 O ( n log ⁡ n ) O(n\log n) O(nlogn)求出后做一遍 exp ⁡ \exp exp即可。


例题

BZOJ3625 小朋友和二叉树

给定 n n n 和数组 A A A,对于所有 m ≤ n m ≤ n mn,求有多少点带权二叉树,点权和为
m m m,且所有点的权值都在数组 A A A 中,两棵二叉树不同,当且仅当根节点
点权不同,或者左右子树有至少一个不同。
n ≤ 1 0 5 n ≤ 10^5 n105

点的 O G F OGF OGF
G ( x ) = ∑ i = 0 ∞ [ i ∈ A ] x i G(x)=\sum\limits_{i=0}^{\infty}[i\in A]x^i G(x)=i=0[iA]xi

设树的 O G F OGF OGF
F = G F 2 + 1 F=GF^2+1 F=GF2+1
F = 1 1 + 1 − G 2 F=\dfrac{1}{1+\sqrt{1-G^2}} F=1+1G2 1
( F = 1 1 − 1 − G 2 F=\dfrac{1}{1-\sqrt{1-G^2}} F=11G2 1在0处不收敛,舍去)

BZOJ 3456:城市规划

n n n 个点带标号的连通图个数。
n ≤ 1 0 5 n ≤ 10^5 n105

无向图的 E G F EGF EGF
G ( x ) = ∑ i = 0 ∞ 2 ( i 2 ) x i i ! G(x)=\sum\limits_{i=0}^{\infty}2^{\binom i2}\dfrac{x^i}{i!} G(x)=i=02(2i)i!xi
简单连通图的 E G F EGF EGF
F ( x ) = ∑ i = 0 ∞ f i x i i ! F(x)=\sum\limits_{i=0}^{\infty}f_i\dfrac{x^i}{i!} F(x)=i=0fii!xi

无向图是由若干个简单连通图拼接起来的带标号集合。
G = e F → F = ln ⁡ G G=e^F\to F=\ln G G=eFF=lnG

BZOJ4228 Tibbar 的后花园

n n n个点的满足如下条件无向图个数:
任意三个点能互相到达的点 a , b , c a, b, c a,b,c d i s ( a , b ) , d i s ( b , c ) , d i s ( a , c ) dis(a, b),dis(b, c),dis(a, c) dis(a,b),dis(b,c),dis(a,c) 不能三个
同时相等。
n ≤ 1 0 5 n ≤ 10^5 n105

满足条件的无向图只有链和长度不为3的倍数的环。

链的 E G F EGF EGF
A ( x ) = ∑ i = 0 ∞ i ! 2 x i i ! = ∑ i = 0 ∞ x i 2 A(x)=\sum\limits_{i=0}^{\infty}\dfrac{i!}{2}\dfrac{x^i}{i!}=\sum\limits_{i=0}^{\infty}\dfrac{x^i}{2} A(x)=i=02i!i!xi=i=02xi

环的 E G F EGF EGF
B ( x ) = ∑ i = 0 ∞ ( ( 3 i ) ! 2 x 3 i + 1 ( 3 i + 1 ) ! + ( 3 i + 1 ) ! 2 x 3 i + 2 ( 3 i + 2 ) ! ) = ∑ i = 0 ∞ ( x 3 i + 1 6 i + 2 + x 3 i + 2 6 i + 4 ) B(x)=\sum\limits_{i=0}^{\infty}(\dfrac{(3i)!}{2}\dfrac{x^{3i+1}}{(3i+1)!}+\dfrac{(3i+1)!}{2}\dfrac{x^{3i+2}}{(3i+2)!})=\sum\limits_{i=0}^{\infty}(\dfrac{x^{3i+1}}{6i+2}+\dfrac{x^{3i+2}}{6i+4}) B(x)=i=0(2(3i)!(3i+1)!x3i+1+2(3i+1)!(3i+2)!x3i+2)=i=0(6i+2x3i+1+6i+4x3i+2)

答案 G = e A + B G=e^{A+B} G=eA+B


参考资料:
dzyo的讲义
指数型生成函数 及 多项式求ln-Mychael

你可能感兴趣的:(---多项式---,生成函数)