自然数幂和 伯努利数

假设我们现在要求
G(N,k)=N1i=0ik
N1018,k105
998244353

通常的思路是直接枚举 i ,但此时的 N 非常大,所以我们只能考虑转化问题。

为了解决这题,我们先引入一个量——-伯努利数 Bi

其定义为
B0=1
ni=0Cin+1Bi=0n>0

也可以用幂级母函数来表示

xex1=i0Bixii!

我们再定义一个多项式 Bn(t)

Bn(t)=k=0n1BktnkCkn

我们还有

Bn(t+1)Bn(t)=k=0n1Bk(t+1)nktnkCkn

=k=0n1Bk(i=0nk1Cinkti)Ckn

=k=0n1Bk(i=0nk1CinktiCkn)

=k=0n1Bk(i=0nk1CknitiCin)

=i=0n1Cintik=0n1iBkCkni

注意到后面的求和与伯努利数的定义极为相同。
也就是说

n1i>0,k=0n1iBkCkni=0

n1i=0,k=0n1iBkCkni=1

那么 Bn(t+1)Bn(t)=ntn1

所以

t=0N1Bk(t+1)Bk(t)=ki=0N1ik1

Bk(N)=ki=0N1ik1

代换一下 K=k1
BK+1(N)=(K+1)i=0N1iK

i=0N1iK=1K+1i=0KBiNKi+1CiK+1

那么可以发现的是只要我们处理出 Bi ,我们就可以用 O(K) 的时间计算出来
N1i=0iK

那么现在问题变为求 Bi 了。

注意 B 的母函数表示。

xex1=i0Bixii!

i0Bixii!=1i0xi(i+1)!

因为我们只需要用到 B 的前 K 前系数。
所以我们就相当于对多项式 i0xi(i+1)! 求出其在 mod  xK+1 下的逆元即可。
这个可以用 FFT 计算出来。

那么总的时间复杂度就是 O(KlogK+K)

你可能感兴趣的:(自然数幂和 伯努利数)