生成函数学习笔记


一个非常好的 题单

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

如果没有 @关怀他人 ,这篇文章估计永远不会发表吧。这里膜拜一下这位神仙。

前置芝士

  1. 多项式全家桶(多项式乘法(FFT&NTT)、求逆、除法、 ln ⁡ \ln ln exp ⁡ \exp exp、快速幂)
  2. 生成函数( OGF, EGF )的定义
  3. 组合数、微积分(泰勒展开)内容
  4. 推式子基本能力
  5. 所有初中数学内容

P6012 [数学]加强版

Description

在一个长度为 n n n 的序列中任选 k k k 个数,求所有情况中选中的数的乘积之和。

1 ≤ k ≤ n ≤ 1.2 × 1 0 5 1 \le k \le n \le 1.2 \times 10^5 1kn1.2×105

Solution

a i a_i ai 的生成函数为 F i ( x ) = 1 + a i x F_i(x)=1+a_i x Fi(x)=1+aix

所以答案为 [ x k ] ∏ i = 1 n F i ( x ) [x^k] \prod_{i=1}^n F_i(x) [xk]i=1nFi(x)

我们分治NTT即可。由于出题人并不良心,模数为 1 0 9 + 7 10^9+7 109+7 ,所以我们不得不采用任意模数多项式乘法一起喷吧

Code

咕咕咕

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

Description

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

n ≤ 1 0 6 n \le 10^6 n106 ,时限 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=1nCn1i1 g(i)f(ni)=f(n)

这个式子中 i i i 的实际意义为 1 1 1 号节点所在连通块的大小 C n − 1 i − 1 C_{n-1}^{i-1} Cn1i1表示钦定了 i − 1 i-1 i1 个与 1 1 1 连通的节点。

我们拆开组合数,得到 ∑ 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=1n(i1)!g(i)(ni)!f(ni)=(n1)!f(n)

g ′ ( i ) = g ( i ) ( i − 1 ) ! g'(i)=\frac {g(i)} {(i-1)!} g(i)=(i1)!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)=(i1)!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=FG

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

多项式求逆+多项式乘 即可求出 G ′ G' G,从而我们也就得到了 G G G

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

Code

Click Here

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 n106,1Ai,m106 ,时限 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)=[iA](即 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=1m[jA]k=0ijf(k)f(ijk)

F , G F,G F,G 分别为 f , g f,g f,g 的 OGF ,那么
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 ± 14G

由于生成函数的 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+14G
F ( x ) = 2 1 − 4 G F(x)=\frac {2} {\sqrt {1-4G}} F(x)=14G 2

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

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

Code

Click Here

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

Description

给定 n n n,求 ∑ ∑ j = 1 m a j = n , a j ∈ N ∗ ∏ i = 1 m f a i \sum_{\sum_{j=1}^m a_j=n, a_j \in N^*} \prod_{i=1}^m f_{a_i} j=1maj=n,ajNi=1mfai 。这里 f f f斐波那契数列 f i f_i fi 表示斐波那契数列的第 i i i 项。

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

Solution

一道套路题

g i g_i gi 表示当 n = i n=i n=i 时的答案,那么不难得到
g i = ∑ j = 1 i f j   g i − j g_i=\sum_{j=1}^{i} f_j\ g_{i-j} gi=j=1ifj gij

直接递推是 O ( n 2 ) O(n^2) O(n2) 的,使用分治 NTT 是 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n) 的。

考虑优化。令 F , G F,G F,G 分别为 f , g f,g f,g 的 OGF ,那么显然有 G = F G + 1 G=FG+1 G=FG+1

不难发现 F F F 的闭形式为 x 1 − x − x 2 \frac {x} {1-x-x^2} 1xx2x

( 1 − F ) G = 1 (1-F)G=1 (1F)G=1

从而, G = 1 1 − F = 1 1 − 2 x − x 2 1 − x − x 2 = − 1 − x − x 2 1 − 2 x − x 2 = 1 + x 1 − 2 x − x 2 G=\frac 1 {1-F}=\frac 1 {\frac {1-2x-x^2} {1-x-x^2}}=-\frac {1-x-x^2} {1-2x-x^2}=1+\frac {x} {1-2x-x^2} G=1F1=1xx212xx21=12xx21xx2=1+12xx2x

然后我们套路地展开这个式子,从而得到了第 n n n 项的系数为
2 4 [ ( 1 + 2 ) n − ( 1 − 2 ) n ] \frac {\sqrt 2} 4[(1+\sqrt 2)^n-(1-\sqrt 2)^n] 42 [(1+2 )n(12 )n]

在模意义下 2 \sqrt 2 2 59713600 59713600 59713600 940286407 940286407 940286407 ,直接带入即可。

根据费吗小定理,指数可以对 m o d − 1 mod-1 mod1 取模;于是我们一边读入一边取模即可。最后做快速幂即可得到答案。

时间复杂度 O ( log ⁡ 10 n ) O(\log_{10} n) O(log10n)

Code

Click Here

CF891E Lust

Description

n n n 个数,每次可以等概率地选择一个数,将它减一并将答案加上此时除这个数外的其他数之积。求最终答案的期望。

1 ≤ n ≤ 1 0 5 , 1 ≤ k ≤ 1 0 9 1 \le n \le 10^5,1 \le k \le 10^{9} 1n105,1k109

Solution

答案即为初始时所有数的乘积减去所有操作结束后,所有数的乘积的期望值

所以现在的关键在于如何快速计算出后者。

给每一个 a i a_i ai 一个指数生成函数: F i ( x ) = ∑ j = 0 k ( a i − j ) x j j ! F_i(x)=\sum_{j=0}^k (a_i-j)\frac {x^j}{j!} Fi(x)=j=0k(aij)j!xj。这样一来,所有 F i ( x ) F_i(x) Fi(x) 的乘积的 x k x^k xk 项的系数即为答案。

可惜本题中 k k k 较大,不能直接进行分治NTT。这启示我们对上面的 EGF 进行一些转化。

F i ( x ) = ∑ j = 0 k ( a i − j ) x j j ! F_i(x)=\sum_{j=0}^k (a_i-j)\frac {x^j}{j!} Fi(x)=j=0k(aij)j!xj

拆开括号得

F i ( x ) = ∑ j = 0 k a i x j j ! − ∑ j = 0 k j x j j ! F_i(x)=\sum_{j=0}^k a_i \frac {x^j} {j!}-\sum_{j=0}^k j \frac {x^j} {j!} Fi(x)=j=0kaij!xjj=0kjj!xj

根据EGF的定义不难得到

F i ( x ) = a i × e x − x × e x F_i(x)=a_i \times e^x-x \times e^x Fi(x)=ai×exx×ex

F i ( x ) = ( a i − x ) e x F_i(x)=(a_i-x)e^x Fi(x)=(aix)ex

所以,所有 F i ( x ) F_i(x) Fi(x) 的乘积就是
e n x ∏ i = 1 n ( a i − x ) e^{nx}\prod_{i=1}^n (a_i-x) enxi=1n(aix)

这个式子的右半部分可以采用分治NTT直接计算。由于本题只要求第 x k x^k xk 项的系数,所以直接线性求就好了。

现在剩下一个问题: e n x e^{nx} enx 的各项系数中带有阶乘,无法快速求出。

此时一种方法是写一个又臭又长的快速阶乘算法,但是并没有必要。我们可以在另一个程序中打表求出 0 !   ,   ( 1 0 7 ) !   ,   ( 2 × 1 0 7 ) ! ⋯ 0!\ , \ (10^7)!\ , \ (2 \times 10^7)! \cdots 0! , (107)! , (2×107)! ;在我们将要提交的程序中,将这个表复制粘贴进去,运行时先在 O ( 1 0 7 ) O(10^7) O(107) 的时间复杂度内求出 ( k − n ) ! (k-n)! (kn)! 再线性递推即可。

时间复杂度 O ( n log ⁡ n + 1 0 7 ) O(n \log n+10^7) O(nlogn+107)

P4491 [HAOI2018]染色

本题与生成函数无关,可是笔者脑抽了。

Description

为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 n n n 的序列, 每个位置都可以被染成 m m m 种颜色中的某一种.

然而小 C 只关心序列的 n n n 个位置中出现次数恰好为 s s s 的颜色种数, 如果恰好出现了 S S S 次的颜色有 k k k 种, 则小 C 会产生 w k w_k wk 的愉悦度.

小 C 希望知道对于所有可能的染色方案, 他能获得的愉悦度的和对 1004535809 1004535809 1004535809 取模的结果是多少。

1 ≤ n ≤ 1 0 7 , 1 ≤ m ≤ 1 0 5 , 1 ≤ s ≤ 150 1 \le n \le 10^7, 1 \le m \le 10^5, 1 \le s \le 150 1n107,1m105,1s150

Solution

f i f_i fi 表示钦定 i i i恰好出现 S S S 次的颜色的方案数。不难发现
f i = C m i ( m − i ) ( n − i s ) ∏ j = 0 i − 1 C n − j s s f_i=C_m^i (m-i)^{(n-is)}\prod_{j=0}^{i-1} C_{n-js}^s fi=Cmi(mi)(nis)j=0i1Cnjss

g i g_i gi 表示恰好 i i i出现 S S S 次的颜色的方案数。不难发现
f i = ∑ j = i n C j i   g j f_i=\sum_{j=i}^{n} C_j^i\ g_j fi=j=inCji gj

我们可以一边枚举 i i i 一边更新 ∏ j = 0 i − 1 C n − j s s \prod_{j=0}^{i-1} C_{n-js}^s j=0i1Cnjss,从而 f f f 可以 O ( n ) O(n) O(n) 求出。然后,我们二项式反演,即可得到
g i = ∑ j = i n ( − 1 ) j − i C j i f j g_i=\sum_{j=i}^n (-1)^{j-i} C_j^i f_j gi=j=in(1)jiCjifj

拆开组合数即可得到卷积的形式。于是做一遍NTT即可。

时间复杂度 O ( n + m log ⁡ m ) O(n+m \log m) O(n+mlogm)

P4389 付公主的背包

Description

N aCly_Fish \color {black} \text {N} \color {red} \text {aCly\_Fish} NaCly_Fish n n n 种商品,第 i i i 个商品大小为 v i v_i vi 且有无限件。她还有一个可爱的大小为 1 0 5 10^5 105 的背包。她想要知道,对于 s = 0 , 1 , 2 ⋯ m s=0,1,2 \cdots m s=0,1,2m ,在背包中恰好装 s s s 体积的方案数。

她在 1 0 − 998244353 10^{-998244353} 10998244353 秒内就把这题切了,你能打破这个记录吗? 每个答案都要对 998244353 998244353 998244353 取模哦。

1 ≤ n , m ≤ 1 0 6 , 1 ≤ v i ≤ m 1 \le n,m \le 10^6, 1 \le v_i \le m 1n,m106,1vim,时限 2 s 2s 2s

Solution

你强归你强, N aCly_Fish \color {black} \text {N} \color {red} \text {aCly\_Fish} NaCly_Fish比你强。

考虑第 i i i 个物品的生成函数的各项系数应为 { 1 , 0 , 0 ⋯ 0 , 1 , 0 , 0 ⋯ 0 , 1 , 0 ⋯   } \{1,0,0 \cdots 0,1,0,0 \cdots 0,1,0 \cdots \} {1,0,00,1,0,00,1,0}。它的闭形式是 1 1 − x v i \frac {1} {1-x^{v_i}} 1xvi1

如果我们暴力地直接将这些多项式相乘再求逆,那么时间复杂度并不正确。不难发现,这些分式相乘的分子是 1 1 1 ,分母是 ∏ i = 1 n ( 1 − x v i ) \prod_{i=1}^n (1-x^{v_i}) i=1n(1xvi)

考虑化乘为加

∏ i = 1 n ( 1 − x v i ) = e ln ⁡ ( ∏ i = 1 n ( 1 − x v i ) ) = e ∑ i = 1 n ln ⁡ ( 1 − x v i ) \prod_{i=1}^n (1-x^{v_i})=e^{\ln (\prod_{i=1}^n (1-x^{v_i}))}=e^{\sum_{i=1}^n \ln (1-x^{v_i})} i=1n(1xvi)=eln(i=1n(1xvi))=ei=1nln(1xvi)

所以现在关键在于求出 ∑ i = 1 n ln ⁡ ( 1 − x v i ) \sum_{i=1}^n \ln ({1-x^{v_i}}) i=1nln(1xvi)

下面开始秀了。

F ( x ) = 1 − x v F(x)=1-x^{v} F(x)=1xv G ( x ) = ln ⁡ F ( x ) G(x)=\ln F(x) G(x)=lnF(x) ,那么

ln ⁡ F ( x ) = G ( x ) \ln F(x)=G(x) lnF(x)=G(x)

F ( x ) ′ F ( x ) = G ′ ( x ) \frac {F(x)'} {F(x)}=G'(x) F(x)F(x)=G(x)

− v x v − 1 1 − x v = G ′ ( x ) \frac {-vx^{v-1}} {1-x^v}=G'(x) 1xvvxv1=G(x)

− v x v − 1 1 1 − x v = G ′ ( x ) -v x^{v-1} \frac {1} {1-x^v}=G'(x) vxv11xv1=G(x)

− v ∑ i = 0 ∞ x v i + v − 1 = G ′ ( x ) -v \sum_{i=0}^{∞} x^{vi+v-1}=G'(x) vi=0xvi+v1=G(x)

− v ∑ i = 0 ∞ x v i + v v i + v = G ( x ) + C -v \sum_{i=0}^{∞} \frac {x^{vi+v}} {vi+v}=G(x)+C vi=0vi+vxvi+v=G(x)+C

− ∑ i = 0 ∞ x ( i + 1 ) v i + 1 = G ( x ) -\sum_{i=0}^{∞} \frac {x^{(i+1)v}} {i+1}=G(x) i=0i+1x(i+1)v=G(x)

− ∑ i = 1 ∞ x i v i = G ( x ) -\sum_{i=1}^{∞} \frac {x^{iv}} {i}=G(x) i=1ixiv=G(x)

带入原式得

∑ i = 1 n ln ⁡ ( 1 − x v i ) \sum_{i=1}^n \ln ({1-x^{v_i}}) i=1nln(1xvi)

≡ ∑ i = 1 n ∑ j = 1 ∞ x v i j j \equiv \sum_{i=1}^n \sum_{j=1}^{∞} \frac {x^{v_ij}} {j} i=1nj=1jxvij

≡ ∑ j = 1 m 1 j ∑ i = 1 ⌊ m j ⌋ x i j c n t i ( m o d   m ) \equiv \sum_{j=1}^m \frac 1 j \sum_{i=1}^{\lfloor \frac m j \rfloor} x^{ij} cnt_{i} (mod\ m) j=1mj1i=1jmxijcnti(mod m)

这里 c n t i cnt_i cnti 表示在原序列中值为 i i i 的数的数量。

显然这个式子可以在调和级别的时间复杂度内求出。然后 exp ⁡ \exp exp 回去即可得到答案。

时间复杂度 O ( m log ⁡ m ) O(m \log m) O(mlogm) 。牛逼题。

P4705 玩游戏

Description

Alice 和 Bob 又在玩游戏。

对于一次游戏,首先 Alice 获得一个长度为 n n n 的序列 A A A,Bob 获得一个长度为 m m m 的序列 B B B。之后他们各从自己的序列里随机取出一个数,分别设为 A x , B y A_x,B_y Ax,By ,那么这次游戏的 k k k 次价值为 ( A x + B y ) k (A_x+B_y)^k (Ax+By)k

由于他们发现这个游戏实在是太无聊了,所以想让你帮忙计算对于 i = 1 , 2 ⋯ ⋯ t i=1,2 \cdots \cdots t i=1,2t,一次游戏 i i i 次价值的期望是多少。

由于答案可能很大,只需要求出答案在模 998244353 998244353 998244353 意义下的值即可。

1 ≤ n , m , t ≤ 1 0 5 , 1 ≤ A i , B i ≤ 1 0 9 1 \le n,m,t \le 10^5, 1 \le A_i,B_i \le 10^9 1n,m,t105,1Ai,Bi109

Solution

根据期望的定义,第 k k k 个答案为
∑ i = 1 n ∑ j = i + 1 n ( A i + B j ) k n m \frac {\sum_{i=1}^n \sum_{j=i+1}^n (A_i+B_j)^k} {nm} nmi=1nj=i+1n(Ai+Bj)k

于是现在关键在于,对于 k = 0 , 1 , 2 ⋯ t k=0,1,2 \cdots t k=0,1,2t求出 ∑ i = 1 n ∑ j = 1 n ( A i + B j ) k \sum_{i=1}^n \sum_{j=1}^n (A_i+B_j)^k i=1nj=1n(Ai+Bj)k

首先二项式展开得 ∑ i = 1 n ∑ j = i + 1 n ∑ p = 0 k C k p A i p B j k − p \sum_{i=1}^n \sum_{j=i+1}^n \sum_{p=0}^k C_k^p A_i^p B_j^{k-p} i=1nj=i+1np=0kCkpAipBjkp

交换求和号得 ∑ p = 0 k C k p ( ∑ i = 1 n A i p ) ( ∑ j = 1 n B j k − p ) \sum_{p=0}^k C_k^p (\sum_{i=1}^n A_i^p) (\sum_{j=1}^n B_j^{k-p}) p=0kCkp(i=1nAip)(j=1nBjkp)

f ( x ) = ∑ i = 1 n A i x ,   g ( x ) = ∑ i = 1 n B i x f(x)=\sum_{i=1}^n A_i^x,\ g(x)=\sum_{i=1}^n B_i^x f(x)=i=1nAix, g(x)=i=1nBix,带入得

∑ p = 0 k C k p   f ( p )   g ( k − p ) \sum_{p=0}^k C_k^p\ f(p)\ g(k-p) p=0kCkp f(p) g(kp)

展开组合数得

k ! ∑ p = 0 k ( 1 p ! f ( p ) )   ( 1 ( k − p ) ! g ( k − p ) ) k!\sum_{p=0}^k (\frac 1 {p!}f(p))\ (\frac 1 {(k-p)!} g({k-p})) k!p=0k(p!1f(p)) ((kp)!1g(kp))

这是一个卷积的形式,直接NTT即可。于是现在关键在于求出 f , g f,g f,g 。由于 f , g f,g f,g 函数的求法基本相同,所以下文用 f f f 为例。

A i A_i Ai 的生成函数为 1 1 − A i x \frac 1 {1-A_ix} 1Aix1,那么 f ( k ) = [ x k ] ∑ i = 1 n 1 1 − A i x f(k)=[x^k] \sum_{i=1}^n \frac 1 {1-A_ix} f(k)=[xk]i=1n1Aix1

直接通分+暴力加减是 O ( n 2 ) O(n^2) O(n2)的。


根据 ln ⁡ ( F ( x ) ) ′ = F ( x ) ′ F ( x ) \ln(F(x))'=\frac {F(x)'} {F(x)} ln(F(x))=F(x)F(x)
不难得到 ( ∑ i = 1 n ln ⁡ ( 1 − A i x ) ′ ) = ∑ i = 1 n − A i 1 − A i x (\sum_{i=1}^n \ln({1-A_ix})')=\sum_{i=1}^n \frac {-A_i} {1-A_ix} (i=1nln(1Aix))=i=1n1AixAi


F ( x ) = ∑ i = 1 n 1 1 − A i x F(x)=\sum_{i=1}^n \frac 1 {1-A_ix} F(x)=i=1n1Aix1
G ( x ) = ∑ i = 1 n − A i 1 − A i x G(x)=\sum_{i=1}^n \frac {-A_i} {1-A_ix} G(x)=i=1n1AixAi
因为 − A i 1 − A i x ( − x ) + 1 = 1 1 − A i x \frac {-A_i} {1-A_ix}(-x)+1=\frac 1 {1-A_ix} 1AixAi(x)+1=1Aix1
所以 F ( x ) = − x G ( x ) + n F(x)=-xG(x)+n F(x)=xG(x)+n

现在的关键在于求出 G G G

根据 F ( x ) ′ + G ( x ) ′ = ( F ( x ) + G ( x ) ) ’ F(x)'+G(x)'=(F(x)+G(x))’ F(x)+G(x)=(F(x)+G(x)),不难得到

G ( x ) = ( ∑ i = 1 n ln ⁡ ( 1 − A i x ) ) ′ G(x)=(\sum_{i=1}^n \ln(1-A_ix))' G(x)=(i=1nln(1Aix))

根据 ln ⁡ ( x ) + ln ⁡ ( y ) = ln ⁡ ( x y ) \ln(x)+\ln(y)=\ln(xy) ln(x)+ln(y)=ln(xy),显然有

G ( x ) = ln ⁡ ( ∏ i = 1 n ( 1 − A i x ) ) ′ G(x)=\ln(\prod_{i=1}^n (1-A_ix))' G(x)=ln(i=1n(1Aix))

于是我们分治NTT求出 ∏ i = 1 n ( 1 − A i x ) \prod_{i=1}^n (1-A_ix) i=1n(1Aix),然后多项式求 ln ⁡ \ln ln再求导即可。

瓶颈在于分治NTT,时间复杂度为 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)


实际上,本题的理论复杂度可以做到 O ( n log ⁡ n ) O(n \log n) O(nlogn) 。这留给学有余力的读者思考。

P5748 集合划分计数

Description

一个有 n n n 个元素的集合,将其分为任意个非空子集,求方案数。由于答案可能会很大,所以要对 998244353 998244353 998244353 取模。

Q Q Q 次询问, 1 ≤ n ≤ 1 0 5 , 1 ≤ Q ≤ 1 0 3 1 \le n \le 10^5,1 \le Q \le 10^3 1n105,1Q103

Solution

B i B_i Bi 表示当 n = i n=i n=i 时的答案。不难发现

B i = ∑ j = 1 i C i − 1 j − 1 B i − j B_i=\sum_{j=1}^i C_{i-1}^{j-1} B_{i-j} Bi=j=1iCi1j1Bij

把式子化成好看一点的形式

B i + 1 = ∑ j = 0 i C i j B j B_{i+1}=\sum_{j=0}^{i} C_{i}^{j} B_{j} Bi+1=j=0iCijBj

∑ i = 0 ∞ B i + 1 = ∑ i = 0 ∞ ∑ j = 0 i C i j B j \sum_{i=0}^{∞} B_{i+1}=\sum_{i=0}^{∞} \sum_{j=0}^i C_i^j B_j i=0Bi+1=i=0j=0iCijBj

F ( x ) F(x) F(x) B B BEGF,那么不难发现

B ( x ) ′ = e x B ( x ) B(x)'=e^x B(x) B(x)=exB(x)

考虑解这个微分方程。移项得

B ( x ) ′ B ( x ) = e x \frac {B(x)'} {B(x)}=e^x B(x)B(x)=ex

两边同时积分,

ln ⁡ ( B ( x ) ) = e x + C \ln(B(x))=e^x+C ln(B(x))=ex+C

考虑当 x = 0 x=0 x=0 时,左式为 ln ⁡ 1 = 0 \ln 1 =0 ln1=0 ,而右侧的 e x = 1 e^x=1 ex=1 ,所以 C C C − 1 -1 1 。带入得

ln ⁡ ( B ( x ) ) = e x − 1 \ln(B(x))=e^x-1 ln(B(x))=ex1

然后两边同时 exp ⁡ \exp exp 一下,得到

B ( x ) = e e x − 1 B(x)=e^{e^x-1} B(x)=eex1

于是我们做两遍多项式 exp ⁡ \exp exp 即可预处理出所有的 B B B ,每次询问 O ( 1 ) O(1) O(1) 查询即可。

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

P4463 calc加强版

Description

f ( x , y ) f(x,y) f(x,y) 表示在 [ 1 , x ] [1,x] [1,x] 中任选 y y y 个数的乘积之和。

给定 m , n m,n m,n ,请对于每一个在 [ 1 , n ] [1,n] [1,n] x x x ,求出 f ( m , x ) f(m,x) f(m,x)

每个答案都需要对 998244353 998244353 998244353 取模。


对于 100 % 100\% 100% 的数据满足, 1 ≤ m ≤ k < 998244353 1 \le m \le k < 998244353 1mk<998244353

Solution

不难发现

f ( n , m ) = [ x m ] ∏ i = 1 n ( 1 + i x ) f(n,m)=[x^m]\prod_{i=1}^n (1+ix) f(n,m)=[xm]i=1n(1+ix)

注意题目中的 n n n 很大,直接暴力分治 NTT 的话会爆炸。

我们套路地用 ln ⁡ \ln ln 化乘为加:

∏ i = 1 m ( 1 + i x ) \prod_{i=1}^m (1+ix) i=1m(1+ix)

= exp ⁡ ( ln ⁡ ( ∏ i = 1 m ( 1 + i x ) ) ) =\exp \left(\ln \left(\prod_{i=1}^m (1+ix) \right) \right) =exp(ln(i=1m(1+ix)))

= exp ⁡ ( ∑ i = 1 m ln ⁡ ( 1 + i x ) ) =\exp \left(\sum_{i=1}^m \ln(1+ix) \right) =exp(i=1mln(1+ix))

考虑展开 ln ⁡ ( 1 + i x ) \ln(1+ix) ln(1+ix) 。我们将 i x ix ix 看做一个整体。

为了方便叙述,令 A ( x ) = ln ⁡ ( 1 + p ) A(x)=\ln( 1+p) A(x)=ln(1+p)

ln ⁡ ( 1 + p ) = A ( x ) \ln(1+p)=A(x) ln(1+p)=A(x)

ln ⁡ ′ ( 1 + p ) = A ′ ( x ) \ln'(1+p)=A'(x) ln(1+p)=A(x)

1 1 + p = A ′ ( x ) \frac {1} {1+p}=A'(x) 1+p1=A(x)

∑ j = 0 ∞ ( − p ) j = A ′ ( x ) \sum_{j=0}^{∞}(-p)^j=A'(x) j=0(p)j=A(x)

( ∑ j = 1 ∞ ( − p ) j j ) + C = A ( x ) \left(\sum_{j=1}^{∞} \frac {(-p)^j} {j}\right)+C=A(x) (j=1j(p)j)+C=A(x)

由于当 p = 0 p=0 p=0 时, ∑ j = 1 ∞ ( − p ) j j = 0 \sum_{j=1}^{∞} \frac {(-p)^j} {j}=0 j=1j(p)j=0 A ( x ) = 0 A(x)=0 A(x)=0 ,所以 C = 0 C=0 C=0 。从而得到:

A ( x ) = ∑ j ≥ 1 ( − 1 ) j j p j A(x)=\sum_{j \ge 1} \frac {(-1)^j} {j} p^j A(x)=j1j(1)jpj


带回原式

exp ⁡ ( ∑ i = 1 m ln ⁡ ( 1 + i x ) ) \exp \left(\sum_{i=1}^m \ln(1+ix) \right) exp(i=1mln(1+ix))

= exp ⁡ ( ∑ i = 1 m ∑ j ≥ 1 ( − 1 ) j j ( i x ) j ) =\exp \left (\sum_{i=1}^m \sum_{j \ge 1} \frac {(-1)^j} {j} (ix)^j \right) =exp(i=1mj1j(1)j(ix)j)

= exp ⁡ ( ∑ j ≥ 1 ( − 1 ) j j ∑ i = 1 m ( i x ) j ) =\exp \left (\sum_{j \ge 1}\frac {(-1)^j} {j} \sum_{i=1}^m (ix)^j \right) =exp(j1j(1)ji=1m(ix)j)

= exp ⁡ ( ∑ j ≥ 1 ( − 1 ) j ( j − 1 ) ! ∑ i = 1 m ( i x ) j j ! ) =\exp \left (\sum_{j \ge 1} (-1)^j (j-1)!\sum_{i=1}^m \frac {(ix)^j} {j!} \right) =exp(j1(1)j(j1)!i=1mj!(ix)j)

F ( x ) = ∑ j ≥ 0 ∑ i = 1 m ( i x ) j j ! F(x)=\sum_{j \ge 0} \sum_{i=1}^m \frac {(ix)^j} {j!} F(x)=j0i=1mj!(ix)j

[ x n ] G ( x ) = [ x n ] F ( x ) ⋅ ( − 1 ) n − 1 ( n − 1 ) ! [x^n]G(x)=[x^n]F(x) \cdot (-1)^{n-1}(n-1)! [xn]G(x)=[xn]F(x)(1)n1(n1)!

a n s ( x ) = exp ⁡ ( G ( x ) ) ans(x)=\exp \left(G(x) \right) ans(x)=exp(G(x))

我们通过 F F F 求出 G G G ,再对 G G G 做一遍 exp ⁡ \exp exp 得到多项式 a n s ans ans a n s ans ans 的各项系数即为答案。

现在关键在于求出 F ( x ) F(x) F(x)

F ( x ) = ∑ j ≥ 0 ∑ i = 1 m ( i x ) j j ! F(x)=\sum_{j \ge 0} \sum_{i=1}^m \frac {(ix)^j} {j!} F(x)=j0i=1mj!(ix)j

= ∑ j ≥ 0 e j x =\sum_{j \ge 0} e^{jx} =j0ejx

注意到我们只需要前 m m m 项的系数,于是

∑ j = 0 m e j x \sum_{j=0}^m e^{jx} j=0mejx

= e m x − 1 1 − e − x =\frac {e^{mx}-1} {1-e^{-x}} =1exemx1

注意这个分式的上下两部分的常数项都为 0 0 0 ,于是我们要将它们先全部除以 x x x (即将系数全部左移一位)再做不带余除法。

时间复杂度 O ( m log ⁡ m ) O(m \log m) O(mlogm) 。注意 exp ⁡ \exp exp 的常数很大,可能需要卡常。

P7289 [EZEC-5]Chasse Neige

最后来一道神仙题。

Description

在这里插入图片描述
时限 0.4 s 0.4s 0.4s,空限 256 M B 256MB 256MB

Solution

Part 1: 朴素dp, O ( n 2 ) O(n^2) O(n2)

状态设计:
A i , j A_{i,j} Ai,j:满足 π 1 ≤ π 2 ,   π n − 1 ≥ π n \pi_1 \le \pi_2,\ \pi_{n-1} \ge \pi_{n} π1π2, πn1πn 且有 k k k 个峰的排列数量;
B i , j B_{i,j} Bi,j:满足 π 1 ≤ π 2 ,   π n − 1 ≤ π n \pi_1 \le \pi_2,\ \pi_{n-1} \le \pi_{n} π1π2, πn1πn 且有 k k k 个峰的排列数量;
C i , j C_{i,j} Ci,j:满足 π 1 ≥ π 2 ,   π n − 1 ≤ π n \pi_1 \ge \pi_2,\ \pi_{n-1} \le \pi_{n} π1π2, πn1πn 且有 k k k 个峰的排列数量;
D i , j D_{i,j} Di,j:满足 π 1 ≥ π 2 ,   π n − 1 ≥ π n \pi_1 \ge \pi_2,\ \pi_{n-1} \ge \pi_{n} π1π2, πn1πn 且有 k k k 个峰的排列数量。

状态意义:

如下图。从上到下,从左到右分别表示 A , B , C , D A,B,C,D A,B,C,D。蓝点表示一个峰。

在这里插入图片描述

状态转移:

首先思考状态与状态之间比较显然的联系

B i , j = C i , j B_{i,j}=C_{i,j} Bi,j=Ci,j
A i , j = D i , j − 1 A_{i,j}=D_{i,j-1} Ai,j=Di,j1

①: 考虑将 B B B旋转 180 ° 180 \degree 180°可以得到 C C C。根据 B , C B,C B,C的状态设计,不难发现翻转后峰的数量不变,即 B i , j = C i , j B_{i,j}=C_{i,j} Bi,j=Ci,j

②考虑将 A A A旋转 180 ° 180 \degree 180°可以得到 D D D。根据 A , D A,D A,D的状态设计,不难发现翻转后峰的数量减去了 1 1 1,即 A i , j = D i , j − 1 A_{i,j}=D_{i,j-1} Ai,j=Di,j1

然后状态与状态之间较为复杂的联系

考虑上一秒钟,排列 π \pi π的长度为 i i i,形如 A / B / C / D A/B/C/D A/B/C/D;这一秒加入了 i + 1 i+1 i+1这个数后,序列会长什么样。

于是我们得到了以下状态转移,很快啊

A i , j = 2 j   A i − 1 , j + ( i − 2 j )   A i − 1 , j − 1 + B i − 1 , j − 1 + C i − 1 , j − 1 A_{i,j}=2j\ A_{i-1,j}+(i-2j)\ A_{i-1,j-1}+B_{i-1,j-1}+C_{i-1,j-1} Ai,j=2j Ai1,j+(i2j) Ai1,j1+Bi1,j1+Ci1,j1

B i , j = 2 j   B i − 1 , j + ( i − 2 j − 1 )   B i − 1 , j − 1 + B i − 1 , j + A i − 1 , j + D i − 1 , j − 1 B_{i,j}=2j\ B_{i-1,j}+(i-2j-1)\ B_{i-1,j-1}+B_{i-1,j}+A_{i-1,j}+D_{i-1,j-1} Bi,j=2j Bi1,j+(i2j1) Bi1,j1+Bi1,j+Ai1,j+Di1,j1


(1)对于一个形如 A A A的序列,在峰的严格左边或峰的严格右边加入新数后,峰的数量不变。这样的位置共有 2 j 2j 2j个。

(2)考虑对于一个形如 A A A的序列,其长度为 i − 1 i-1 i1且峰的数量为 j − 1 j-1 j1。当我们加入的新数不在峰值两侧时,峰的数量才能加一;同时我们也要使得加入这个数之后序列依然形如 A A A,所以可插入的位置有 ( i − 1 ) − 1 − 2 ( j − 1 ) = i − 2 j (i-1)-1-2(j-1)=i-2j (i1)12(j1)=i2j个。

(3)插在 B B B的前两个位置之间;
(4)插在 C C C的后两个位置之间。


(1)同③(1)
(2)此时情况与③(2)略显不同。考虑对于一个形如 B B B的序列,其长度为 i − 1 i-1 i1且峰的数量为 j − 1 j-1 j1。当我们加入的新数不在峰值两侧时,峰的数量才能加一;同时我们也要使得加入这个数之后序列依然形如 A A A,因此不能插在前两个位置之间,所以可插入的位置有 ( i − 12 − 1 − 2 ( j − 1 ) = i − 2 j − 1 (i-12-1-2(j-1)=i-2j-1 (i1212(j1)=i2j1个。
(3)插在 B B B的前两个位置之间;
(4)插在 A A A的第一个位置;
(5)插在 D D D的后两个位置之间。

你还记得状态与状态之间显然的联系吗?我们可以通过①②化简这两个状态转移,使得这两个式子仅仅与 A , B A,B A,B有关。

③: A i , j = 2 j   A i − 1 , j + ( i − 2 j )   A i − 1 , j − 1 + 2   B i − 1 , j − 1 A_{i,j}=2j\ A_{i-1,j}+(i-2j)\ A_{i-1,j-1}+2\ B_{i-1,j-1} Ai,j=2j Ai1,j+(i2j) Ai1,j1+2 Bi1,j1
④: B i , j = ( 2 j + 1 )   B i − 1 , j + ( i − 2 j − 1 )   B i − 1 , j − 1 + 2   A i − 1 , j B_{i,j}=(2j+1)\ B_{i-1,j}+(i-2j-1)\ B_{i-1,j-1}+2\ A_{i-1,j} Bi,j=(2j+1) Bi1,j+(i2j1) Bi1,j1+2 Ai1,j

答案: f n , k f_{n,k} fn,k
边界: A 0 , 0 = B 0 , 0 = 1 A_{0,0}=B_{0,0}=1 A0,0=B0,0=1

不难发现这个 d p dp dp做法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。我们预处理出 d p dp dp数组,每次即可完成 O ( 1 ) O(1) O(1)查询。

期望得分 32 32 32分。卡老师果然毒瘤

Part 2: 数据范围的性质+新的 d p dp dp,分治NTT,时间复杂度 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)

Part 1中的 d p dp dp的状态本身数量已经爆炸,似乎非常难再进行一些优化了。

于是我们观察数据范围,惊人地发现 max ⁡ ( 1 , ⌊ n − 1 2 ⌋ − 10 ) ≤ k ≤ ⌊ n − 1 2 ⌋ \max(1,\lfloor \frac {n-1} 2 \rfloor -10) \le k \le \lfloor \frac {n-1} 2 \rfloor max(1,2n110)k2n1

这个东西有什么用呢?这意味着 k k k ⌊ n − 1 2 ⌋ \lfloor \frac {n-1} 2 \rfloor 2n1相差不大。换句话说,如果我们把 d p dp dp数组看成一个很大的矩阵,那么答案的位置十分靠近对角线。

于是,我们只需要快速求出对角线上的所有 d p dp dp值,然后暴力转移即可。不难发现,这里的暴力转移的次数不会超过 100 100 100次,于是现在唯一的问题在于如何快速求出对角线上的 d p dp dp

状态设计:
f i f_i fi表示,满足 π 1 < π 2 , π n − 1 > π n \pi_1<\pi_2,\pi_{n-1}>\pi_n π1<π2,πn1>πn交错排列 π \pi π数量;
g i g_i gi表示,满足 π 1 < π 2 , π n − 1 < π n \pi_1<\pi_2,\pi_{n-1}<\pi_n π1<π2,πn1<πn交错排列 π \pi π数量;
钦定 f o d d = 0 , g e v e n = 1 f_{odd}=0,g_{even}=1 fodd=0,geven=1

状态转移:
f i = ∑ j = 1 i − 1 C i j   f j   f i − 1 − j f_i=\sum_{j=1}^{i-1} C_i^j\ f_j\ f_{i-1-j} fi=j=1i1Cij fj fi1j

g i = ∑ j = 1 i − 1 C i j   g j   f i − 1 − j g_i=\sum_{j=1}^{i-1} C_i^j\ g_j\ f_{i-1-j} gi=j=1i1Cij gj fi1j

这里对状态转移⑤做出必要的解释。

在这里插入图片描述

如上图,我们枚举了左边 f f f的长度 j j j,那么右边 f f f的长度就是 i − j − 1 i-j-1 ij1。同时,我们也要选择一些数放到左边的 f f f中去,选择的方案数为 C i j C_i^j Cij。根据乘法原理不难得到⑤。

⑥的证明同理,这里不再赘述。


分治NTT即可,时间复杂度为 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)被卡掉了

Part 3: 微分方程+泰勒展开+多项式求逆,时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn),本题精髓所在

很可惜,加强版的时限为 0.4 s 0.4s 0.4s,再加上NTT的巨大常数……Part 2不足以通过加强版!它不是正解!

我们再列一下这个状态转移:

f i = ∑ j = 1 i − 1 C i j   f j   f i − 1 − j f_i=\sum_{j=1}^{i-1} C_i^j\ f_j\ f_{i-1-j} fi=j=1i1Cij fj fi1j

g i = ∑ j = 1 i − 1 C i j   g j   f i − 1 − j g_i=\sum_{j=1}^{i-1} C_i^j\ g_j\ f_{i-1-j} gi=j=1i1Cij gj fi1j

f , g f,g f,g的生成函数分别为 F , G F,G F,G,那么有

F ′ ( x ) = F 2 ( x ) + 1 F'(x)=F^2(x)+1 F(x)=F2(x)+1

G ′ ( x ) = F ( x ) G ( x ) G'(x)=F(x)G(x) G(x)=F(x)G(x)

这里大概解释一下这两个式子。对指数生成函数较为熟悉的同学可以跳过。

Lemma 1

F ( x ) ′ = 1 x F ( x ) F(x)'=\frac 1 x F(x) F(x)=x1F(x)

Certification 1

考虑 x k k ! \frac {x^k} {k!} k!xk的导数是什么。

对于分母而言, k ! k! k!不可导,所以保留 1 k ! \frac 1 {k!} k!1

对于分子而言, ( x k ) ′ = k x k − 1 (x^k)'=k x^{k-1} (xk)=kxk1

所以 x k k ! = k x k − 1 k ! = x k − 1 ( k − 1 ) ! \frac {x^k} {k!}=\frac {kx^{k-1}} {k!}=\frac {x^{k-1}}{(k-1)!} k!xk=k!kxk1=(k1)!xk1

带入原式得 F ( x ) ′ = ∑ i = 0 ∞ F i x i − 1 ( i − 1 ) ! = ∑ i = 0 ∞ F i + 1 x i i ! F(x)'=\sum_{i=0}^{∞} F_i \frac {x^{i-1}}{(i-1)!}=\sum_{i=0}^{∞} F_{i+1} \frac {x^i} {i!} F(x)=i=0Fi(i1)!xi1=i=0Fi+1i!xi

所以 F ( x ) ′ = 1 x F ( x ) F(x)'=\frac 1 x F(x) F(x)=x1F(x)

Lemma 2

对于两个EGF F ( x ) G ( x ) F(x)G(x) F(x)G(x),令 P ( x ) = F ( x ) G ( x ) P(x)=F(x)G(x) P(x)=F(x)G(x),那么 [ x t ] P ( x ) = ∑ i = 0 t C t i   F i   G t − i [x^t]P(x)=\sum_{i=0}^t C_t^i\ F_i\ G_{t-i} [xt]P(x)=i=0tCti Fi Gti

Certification 2

考虑到 ( ∑ i = 0 t C t i   F i   G t − i ) x t t ! = ∑ i = 0 t F i i ! G t − i ( t − i ) ! x t t ! (\sum_{i=0}^t C_t^i\ F_i\ G_{t-i})\frac {x^t} {t!}=\sum_{i=0}^t \frac {F_i} {i!} \frac {G_{t-i}} {(t-i)!} \frac {x^t} {t!} (i=0tCti Fi Gti)t!xt=i=0ti!Fi(ti)!Gtit!xt

此时成为了一个卷积的形式,所以 F ( x ) G ( x ) = P ( x ) F(x)G(x)=P(x) F(x)G(x)=P(x)


将⑦⑧联立,得到了一个微分方程,解得 F ( x ) = tan ⁡ ( x ) , G ( x ) = sec ⁡ ( x ) F(x)=\tan(x), G(x)=\sec(x) F(x)=tan(x),G(x)=sec(x)

于是我们将 F ( x ) F(x) F(x) G ( x ) G(x) G(x)泰勒展开并转变为指数生成函数即可。最后随便递推一下就得到了答案。

在实现的时候,由于 G ( x ) c o s ( x ) = 1 G(x)cos(x)=1 G(x)cos(x)=1,所以我们可以将我们更为熟悉的 c o s ( x ) cos(x) cos(x)展开再多项式求逆转化为 G ( x ) G(x) G(x)

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

Summary

本题的重难点是Part 1中的 d p dp dp。那个 d p dp dp比较难想而且状态转移也比较容易写错。接下来的每一步,实际上都是比较套路的。步骤较多,考察了做题人的耐心;同时考察了一些高等数学的技巧。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值