生成函数学习笔记

文章目录

一个非常好的题单

本详解中,所有的题目的数据范围都经过了笔者的加强,而并不是原题的数据范围,这样可以促进读者更深的思考

[集训队作业2013]城市规划

Description

求 n n n 个点的有标号无向连通图的数量。答案对 1004535809 1004535809 1004535809 取模。

n ≤ 1 0 6 n \le 10^6 n≤106 ,时限 2 s 2s 2s 。

Solution

首先考虑 n n n 个点的有标号无向图的数量 f ( n ) f(n) f(n) 。显然有 f ( n ) = 2 C n 2 f(n)=\text 2^{C_n^2} f(n)=2Cn2​

n n n 个点的有标号无向连通图的数量 g ( n ) g(n) g(n) 满足
∑ i = 1 n C n − 1 i − 1   g ( i ) f ( n − i ) = f ( n ) \sum_{i=1}^{n} C_{n-1}^{i-1}\ g(i) f(n-i)=f(n) i=1∑n​Cn−1i−1​ g(i)f(n−i)=f(n)

直接高斯消元是 O ( n 3 ) O(n^3) O(n3) 的。

考虑优化。我们拆开组合数,得到 ∑ i = 1 n g ( i ) ( i − 1 ) ! f ( n − i ) ( n − i ) ! = f ( n ) ( n − 1 ) ! \sum_{i=1}^n \frac {g(i)} {(i-1)!} \frac {f(n-i)} {(n-i)!}=\frac {f(n)} {(n-1)!} i=1∑n​(i−1)!g(i)​(n−i)!f(n−i)​=(n−1)!f(n)​

令 g ′ ( i ) = g ( i ) ( i − 1 ) ! g'(i)=\frac {g(i)} {(i-1)!} g′(i)=(i−1)!g(i)​

f ′ ( i ) = f ( i ) i ! f'(i)=\frac {f(i)} {i!} f′(i)=i!f(i)​

f ′ ′ ( i ) = f ( i ) ( i − 1 ) ! f''(i)=\frac {f(i)} {(i-1)!} f′′(i)=(i−1)!f(i)​

令 G ′ , F ′ , F ′ ′ G',F',F'' G′,F′,F′′分别为 g ′ , f ′ , f ′ ′ g',f',f'' g′,f′,f′′ 的 OGF ,显然有
F ′ ′ = F ′ G ′ F''=F'G' F′′=F′G′

即 G ′ = F ′ ′ × ( F ′ ) − 1 G'=F'' \times (F')^{-1} G′=F′′×(F′)−1

多项式求逆+多项式乘 即可求出 G ′ G' G′,然后再算回去不难得到答案。

时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn) 。

CF438E: The Child and Binary Tree

Description

给定一个长度为 n n n 的正整数序列 A A A 。

一个二叉树可爱当且仅当这个二叉树上所有节点的点权都来自于 A A A 。

定义一棵二叉树的权值为这棵二叉树的所有节点的点权之和

对于每个 i ∈ [ 1 , m ] i \in [1,m] i∈[1,m] ,分别求出权值为 i i i 的可爱二叉树的数量。答案对 998244353 998244353 998244353 取模。

n ≤ 1 0 6 , 1 ≤ A i , m ≤ 1 0 6 n \le 10^6, 1 \le A_i, m \le 10^6 n≤106,1≤Ai​,m≤106 ,时限 2 s 2s 2s 。

Solution

令 f ( i ) f(i) f(i) 为权值为 i i i 个可爱二叉树的数量, g ( i ) = [ i ∈ A ] g(i)=[i \in A] g(i)=[i∈A](即 i i i 是否在 A A A 中)。不难发现递推式
f ( i ) = ∑ j = 1 m [ j ∈ A ] ∑ k = 0 i − j f ( k ) f ( i − j − k ) f(i)=\sum_{j=1}^m [j \in A] \sum_{k=0}^{i-j} f(k)f(i-j-k) f(i)=j=1∑m​[j∈A]k=0∑i−j​f(k)f(i−j−k)

令 F , G F,G F,G 分别为 f , g f,g f,g 的生成函数,那么
F = F 2 G + 1 F=F^2G+1 F=F2G+1

大力解一元二次方程,得 F ( x ) = 1   ±   1 − 4 G 2 G F(x)=\frac {1 \ ± \ \sqrt {1-4G}} {2G} F(x)=2G1 ± 1−4G ​​

由于生成函数的 0 0 0 次项应为 1 1 1 ,所以应取 − - − 。

但是,这个式子很难计算,因为 2 G 2G 2G 的常数项的系数可能是 0 0 0 ,这导致我们无法使用多项式求逆,而且分治NTT也被卡掉了。所以,我们不得不整理这个式子,使得需要求逆的部分的常数项一定不为 0 0 0

上下同乘 1 + 1 − 4 G 1+\sqrt {1-4G} 1+1−4G ​ 得
F ( x ) = 2 1 − 4 G F(x)=\frac {2} {\sqrt {1-4G}} F(x)=1−4G ​2​

多项式开根+多项式求逆即可。

时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn) 。

P4451 [国家集训队]整数的lqp拆分

Description

求 ∑ ∑ j = 1 m a j = n ∏ i = 1 m F a i \sum_{\sum_{j=1}^m a_j=n} \prod_{i=1}^m F_{a_i} ∑∑j=1m​aj​=n​∏i=1m​Fai​​ 。这里 F F F 为斐波那契数列 , F i F_i Fi​ 表示斐波那契数列的第 i i i 项。

n ≤ 1 0 1 0 7 n \le 10^{10^7} n≤10107,时限 1 s 1s 1s 。

Solution

暂咕。

上一篇:关于网站在不同的网络访问不了的原因


下一篇:Cat.1和Cat.4的区别