形如 Sk(n)=n∑i=0ik 的式子被称为自然数幂和。
本文介绍了求自然数幂和的若干方法,其中包括斯特林数和伯努利数的一些应用,其中证明的推导过程也有一些推式子的技巧。
应用两次扰动法,当 k⩾1 时,得:
Sk(n)=n∑i=0ik=n∑i=0(i+1)k−(n+1)k=n∑i=0k∑j=0(kj)ij−(n+1)k=k∑j=0(kj)Sj(n)−(n+1)k=k−2∑j=0(kj)Sj(n)+kSk−1(n)+Sk(n)−(n+1)k
得:
Sk−1(n)=(n+1)k−k−2∑j=0(kj)Sj(n)kSk(n)=(n+1)k+1−k−1∑j=0(k+1j)Sj(n)k+1
直接计算可以做到 O(k2)。分治 FFT 可以做到 O(klog2k)。
由扰动法推得的式子,发现 Sk(n) 为 k+1 次多项式,因此可以考虑拉格朗日插值法,代入 (0,Sk(0)),(1,Sk(1)),…,(k+1,Sk(k+1)) 这 k+2 个点值,得:
f(x)=k+1∑i=0yi∏i≠jx−xjxi−xjSk(n)=k+1∑i=0Sk(i)∏i≠jn−ji−j
因为取值是连续的,后一项中的分子和分母可以分别计算,预处理后可以实现复杂度为 O(k)。
考虑如何计算 Sk(i),对于 ik 可以进行线性筛,每个素数暴力快速幂,因为小于等于 n 的素数个数约为 nlnn,得复杂度为 O(klnklogk)=O(k)。
因此总复杂度为 O(k)。
例题:The Sum of the k-th Powers
x¯¯¯n=n∑i=0[ni]xi
通过组合意义即可证明,其也可以用归纳法证明:
已知:
x¯¯¯¯¯¯¯¯¯¯n−1=n−1∑i=0[n−1i]xi
得:
x¯¯¯¯¯¯¯¯¯¯n−1=n−1∑i=0[n−1i]xi(x+n−1)x¯¯¯¯¯¯¯¯¯¯n−1=(x+n−1)n−1∑i=0[n−1i]xix¯¯¯n=(n−1)n−1∑i=0[n−1i]xi+n∑i=1[n−1i−1]xix¯¯¯n=n∑i=0[ni]xi
代入得:
Sk(n)=n∑i=0ik=n∑i=0(i¯¯¯k−k−1∑j=0[kj]ij)=n∑i=0i¯¯¯k−n∑i=0k−1∑j=0[kj]ij=n∑i=0(i+k−1k)k!−k−1∑j=0[kj]Sj(n)=(n+kk+1)k!−k−1∑j=0[kj]Sj(n)=(n+k)!(n−1)!(k+1)!k!−k−1∑j=0[kj]Sj(n)=n¯¯¯¯¯¯¯¯¯¯k+1k+1−k−1∑j=0[kj]Sj(n)
直接计算可以做到 O(k2)。不用保证模数存在逆元,k+1 一定是 n¯¯¯¯¯¯¯¯¯¯k+1 的约数。
应用归纳法可得:
x¯¯¯n=(−1)n(−x)n––xn––=(−1)n(−x)¯¯¯n
考虑对于 x¯¯¯n=(−1)n(−x)n––,将其中 x 换为 −x,得:
(−x)¯¯¯n=(−1)nxn––
因为有 x¯¯¯n=n∑i=0[ni]xi,得:
(−1)nxn––=n∑i=0[ni](−x)ixn––=n∑i=0(−1)n−i[ni]xi
应用这个式子也可以进行求解:
Sk(n)=n∑i=0ik=n∑i=0(ik––−k−1∑j=0(−1)k−j[kj]ij)=n∑i=0ik––−n∑i=0k−1∑j=0(−1)k−j[kj]ij=n∑i=0(ik)k!−k−1∑j=0(−1)k−j[kj]Sj(n)=(n+1k+1)k!−k−1∑j=0(−1)k−j[kj]Sj(n)=(n+1)k+1–––––k+1−k−1∑j=0(−1)k−j[kj]Sj(n)
直接计算可以做到 O(k2)。不用保证模数存在逆元,k+1 一定是 (n+1)k+1––––– 的约数。
xn=n∑i=0{ni}xi–
通过组合意义即可证明,其也可以用归纳法证明:
已知:
xn−1=n−1∑i=0{n−1i}xi–
得:
xn−1=n−1∑i=0{n−1i}xi–xn=xn−1∑i=0{n−1i}xi–xn=n−1∑i=0{n−1i}ixi–+n−1∑i=0{n−1i}(x−i)xi–xn=n−1∑i=0{n−1i}ixi–+n∑i=1{n−1i−1}xi–xn=n∑i=0{ni}xi–
代入得:
Sk(n)=n∑i=0ik=n∑i=0k∑j=0{kj}ij–=k∑j=0{kj}n∑i=0ij–=k∑j=0{kj}n∑i=0(ij)j!=k∑j=0{kj}(n+1j+1)j!=k∑j=0{kj}(n+1)j+1––––j+1
直接计算可以做到 O(k2)。不用保证模数存在逆元,j+1 一定是 (n+1)j+1–––– 的约数。可以通过卷积 O(nlogn) 求出第二类斯特林数一行后快速求解。
伯努利数前几项为 1,−12,16,0,−130,其为非整数数列,其定义为:
n∑i=0(n+1i)Bi=[n=0]
可以进行 O(n2) 递推求伯努利数。还可以通过生成函数快速求伯努利数,得:
n∑i=0(n+1i)Bi=[n=0]n+1∑i=0(n+1i)Bi=Bn+1+[n=0]n∑i=0(ni)Bi=Bn+[n=1]
发现左边为伯努利数的指数生成函数和指数生成函数 ex 的卷积,得:
B(x)ex=B(x)+xB(x)=xex−1
可以多项式求逆实现 O(nlogn) 求伯努利数。
这里设 Sk(n)=n−1∑i=0ik,伯努利数为自然数幂和对应的多项式的系数:
Sk(n)=1k+1k∑i=0(k+1i)Bink+1−i
考虑证明,设 F(x) 为 Sk(n) 的生成函数,得:
F(x)=∑i⩾0Si(n)i!xi=∑i⩾0n−1∑j=0jixii!=n−1∑j=0∑i⩾0(jx)ii!=n−1∑j=0ejx=enx−1ex−1=B(x)enx−1x=B(x)∑i⩾1(nx)ii!x=B(x)∑i⩾0ni+1xi(i+1)!
因为 [xk]F(x)=Sk(n)k!,得:
Sk(n)=k!k∑i=0Bink+1−ii!(k+1−i)!Sk(n)=1k+1k∑i=0(k+1i)Bink+1−i
应用伯努利数可以求出自然数幂和对应的多项式的系数。
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现