自然数幂和

形如 Sk(n)=i=0nik 的式子被称为自然数幂和。

本文介绍了求自然数幂和的若干方法,其中包括斯特林数和伯努利数的一些应用,其中证明的推导过程也有一些推式子的技巧。

1|0扰动法

应用两次扰动法,当 k1 时,得:

Sk(n)=i=0nik=i=0n(i+1)k(n+1)k=i=0nj=0k(kj)ij(n+1)k=j=0k(kj)Sj(n)(n+1)k=j=0k2(kj)Sj(n)+kSk1(n)+Sk(n)(n+1)k

得:

Sk1(n)=(n+1)kj=0k2(kj)Sj(n)kSk(n)=(n+1)k+1j=0k1(k+1j)Sj(n)k+1

直接计算可以做到 O(k2)。分治 FFT 可以做到 O(klog2k)

2|0拉格朗日插值法

由扰动法推得的式子,发现 Sk(n)k+1 次多项式,因此可以考虑拉格朗日插值法,代入 (0,Sk(0)),(1,Sk(1)),,(k+1,Sk(k+1))k+2 个点值,得:

f(x)=i=0k+1yiijxxjxixjSk(n)=i=0k+1Sk(i)ijnjij

因为取值是连续的,后一项中的分子和分母可以分别计算,预处理后可以实现复杂度为 O(k)

考虑如何计算 Sk(i),对于 ik 可以进行线性筛,每个素数暴力快速幂,因为小于等于 n 的素数个数约为 nlnn,得复杂度为 O(klnklogk)=O(k)

因此总复杂度为 O(k)

例题:The Sum of the k-th Powers

3|0第一类斯特林数

xn¯=i=0n[ni]xi

通过组合意义即可证明,其也可以用归纳法证明:

已知:

xn1¯=i=0n1[n1i]xi

得:

xn1¯=i=0n1[n1i]xi(x+n1)xn1¯=(x+n1)i=0n1[n1i]xixn¯=(n1)i=0n1[n1i]xi+i=1n[n1i1]xixn¯=i=0n[ni]xi

代入得:

Sk(n)=i=0nik=i=0n(ik¯j=0k1[kj]ij)=i=0nik¯i=0nj=0k1[kj]ij=i=0n(i+k1k)k!j=0k1[kj]Sj(n)=(n+kk+1)k!j=0k1[kj]Sj(n)=(n+k)!(n1)!(k+1)!k!j=0k1[kj]Sj(n)=nk+1¯k+1j=0k1[kj]Sj(n)

直接计算可以做到 O(k2)。不用保证模数存在逆元,k+1 一定是 nk+1¯ 的约数。

应用归纳法可得:

xn¯=(1)n(x)n_xn_=(1)n(x)n¯

考虑对于 xn¯=(1)n(x)n_,将其中 x 换为 x,得:

(x)n¯=(1)nxn_

因为有 xn¯=i=0n[ni]xi,得:

(1)nxn_=i=0n[ni](x)ixn_=i=0n(1)ni[ni]xi

应用这个式子也可以进行求解:

Sk(n)=i=0nik=i=0n(ik_j=0k1(1)kj[kj]ij)=i=0nik_i=0nj=0k1(1)kj[kj]ij=i=0n(ik)k!j=0k1(1)kj[kj]Sj(n)=(n+1k+1)k!j=0k1(1)kj[kj]Sj(n)=(n+1)k+1_k+1j=0k1(1)kj[kj]Sj(n)

直接计算可以做到 O(k2)。不用保证模数存在逆元,k+1 一定是 (n+1)k+1_ 的约数。

4|0第二类斯特林数

xn=i=0n{ni}xi_

通过组合意义即可证明,其也可以用归纳法证明:

已知:

xn1=i=0n1{n1i}xi_

得:

xn1=i=0n1{n1i}xi_xn=xi=0n1{n1i}xi_xn=i=0n1{n1i}ixi_+i=0n1{n1i}(xi)xi_xn=i=0n1{n1i}ixi_+i=1n{n1i1}xi_xn=i=0n{ni}xi_

代入得:

Sk(n)=i=0nik=i=0nj=0k{kj}ij_=j=0k{kj}i=0nij_=j=0k{kj}i=0n(ij)j!=j=0k{kj}(n+1j+1)j!=j=0k{kj}(n+1)j+1_j+1

直接计算可以做到 O(k2)。不用保证模数存在逆元,j+1 一定是 (n+1)j+1_ 的约数。可以通过卷积 O(nlogn) 求出第二类斯特林数一行后快速求解。

5|0伯努利数

伯努利数前几项为 1,12,16,0,130,其为非整数数列,其定义为:

i=0n(n+1i)Bi=[n=0]

可以进行 O(n2) 递推求伯努利数。还可以通过生成函数快速求伯努利数,得:

i=0n(n+1i)Bi=[n=0]i=0n+1(n+1i)Bi=Bn+1+[n=0]i=0n(ni)Bi=Bn+[n=1]

发现左边为伯努利数的指数生成函数和指数生成函数 ex 的卷积,得:

B(x)ex=B(x)+xB(x)=xex1

可以多项式求逆实现 O(nlogn) 求伯努利数。

这里设 Sk(n)=i=0n1ik,伯努利数为自然数幂和对应的多项式的系数:

Sk(n)=1k+1i=0k(k+1i)Bink+1i

考虑证明,设 F(x)Sk(n) 的生成函数,得:

F(x)=i0Si(n)i!xi=i0j=0n1jixii!=j=0n1i0(jx)ii!=j=0n1ejx=enx1ex1=B(x)enx1x=B(x)i1(nx)ii!x=B(x)i0ni+1xi(i+1)!

因为 [xk]F(x)=Sk(n)k!,得:

Sk(n)=k!i=0kBink+1ii!(k+1i)!Sk(n)=1k+1i=0k(k+1i)Bink+1i

应用伯努利数可以求出自然数幂和对应的多项式的系数。


__EOF__

本文作者lhm_
本文链接https://www.cnblogs.com/lhm-/p/13550060.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
posted @   lhm_liu  阅读(2028)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示