学到许多。
定义
定义前 n 个自然数 k 次幂的和为:
Sk(n)=n∑i=1ik
性质
Sk(n) 为关于 n 的 k+1 次多项式。
证明考虑对 k 进行归纳。
当 k=0 时,Sk(n)=n,结论成立。
当 k=d 时:
通过二项式定理化简,提出一项相消,有:
(i+1)d+1−id+1=d+1∑j=0(d+1j)ij−id+1=d∑j=0(d+1j)ij
对 (i+1)d+1−id+1 求和,有:
n∑i=1{(i+1)d+1−id+1}=n∑i=1d∑j=0(d+1j)ij
发现 (d+1j) 只与 j 有关,调换求和顺序,有:
n∑i=1d∑j=0(d+1j)ij=d∑j=0(d+1j)n∑i=1ij=d∑j=0(d+1j)Sj(n)
化出了有趣的玩意。
展开左侧 id+1 的求和式相消,则有:
(n+1)d+1−1=d∑j=0(d+1j)Sj(n)
提出右侧 j=d 时的 Sd(n):
(d+1d)Sd(n)=(n+1)d+1−d−1∑j=0{(d+1j)Sj(n)}−1
二项式定理展开右侧,并略做处理:
Sd(n)=1d+1{d+1∑j=0nj−d−1∑j=0{(d+1j)Sj(n)}−1}
对于右侧,通过数学归纳得到 Sj(n) 为关于 n 的 j 次多项式。
则其最高次项出现在 d+1∑j=0nj 中,次数为 d+1。
得证。
暴力计算
看起来很快的 O(nlogk)?
唯一一个复杂度依赖 n 的算法,会被卡爆。
差分法
在性质证明过程的最后,得到了一个优美的式子:
Sk(n)=1k+1{k+1∑j=0nj−k−1∑j=0{(k+1j)Sj(n)}−1}
已知 S0(n)=n,显然可以进行递推。
复杂度
显然的 O(k2)。
优缺点:
优点:无。
缺点:需要求解 k+1 的逆元,模数不为质数时无法使用。
被拉格朗日插值 和 第一类斯特林数多方面吊打。
拉格朗日插值
拉格朗日插值是啥?拉格朗日插值。
由性质,Sk(n) 为关于 n 的 k+1 次多项式,需要 k+2 个点值进行构造。
可以直接取 k+1 个点,按照定义计算出 Sk(n),构造多项式。
复杂度 O(k2)?我觉得不行。
题目对选择的点并没有要求,考虑选取一段连续的点进行优化。
使 xi=i,则选择的点集为 {(i,Sk(i))∣i∈N+,i≤k+2}。
按照定义递推出来即可,复杂度 O(klogk)。
考虑要求的点 (n,Sk(n)),将其代入插值公式,有:
Sk(n)=k+2∑i=1Sk(i)∏i≠jn−ji−j
发现乘积项的分母与 n 无关,提出来:
Sk(n)=k+2∑i=1Sk(i)∏i≠j(n−j)∏i≠j(i−j)
手玩一下乘积项的变化规律。
对于分母,j≤k+2,在已知 i 时有:
1∏i≠j(i−j)=1i(i−1)(i−2)…1×(−1)…(k+2−i−1)(k+2−i)=(−1)k+2−i1i!(k+2−i)!
可先预处理阶乘再求逆元,快速得到分母的值。
对于分子,也暴力拆一波:
∏i≠j(n−j)=n(n−1)…(n−(i−1))(n−(i+1))…(n−(k+2))=(i−1∏j=1(n−j))(k+2∏j=i+1(n−j))
考虑维护 (n−j) 的 前/后 缀积,可快速得到分子的值。
则有:
Sk(n)=k+2∑i=1(−1)k+2−iSk(i)(i−1∏j=1(n−j))(k+2∏j=i+1(n−j))i!(k+2−i)!
复杂度
O(klogk) 处理 k+2 个连续点值。
O(n) 预处理前/后 缀积,阶乘。
求逆元时可以 O(n) 预处理,也可以单次 O(logk)。
总复杂度 O(klogk)。
优缺点
优点:简单好写,复杂度优秀,就感觉到快。
缺点:出现了除法,需要求逆元,需保证模数为质数。
第一类斯特林数
斯特林数是啥? 斯特林数 及 斯特林反演。
Sk(n)=(n+1)k+1–––––k+1−k−1∑i=0⋅[ki]⋅Si(n)
引理 1
xn––=(−1)n(−x)¯¯¯n
x¯¯¯n=(−1)n(−x)n––
以式 1 为例:
暴力展开即可,有:
xn––=n−1∏i=0(x−i)=(−1)nn−1∏i=0−(x−i)=(−1)nn−1∏i=0(−x+i)=(−1)n(−x)¯¯¯n
式 2 同理可证。
引理 2
一个组合恒等式:
nk––=k∑i=0(−1)k−i[ki]ni
考虑 上升幂的性质
n¯¯¯k=k∑i=0[ki]ni
通过 引理 1 进行处理:
n¯¯¯k=k∑i=0[ki]ni(−1)k(−n)k––=k∑i=0[ki]ni
等式两侧同乘 (−1)k,有:
(−1)k(−n)k––=k∑i=0[ki]ni(−n)k––=k∑i=0[ki](−1)kni
又有 i≤k,提出 (−1)i 与 ni 相乘,有:
(−n)k––=k∑i=0[ki](−1)kni(−n)k––=k∑i=0(−1)k−i[ki](−n)ink––=k∑i=0(−1)k−i[ki]ni
得证。
证明
观察引理,对于右侧的求和式,i=k 时,显然 (−1)k−i[ki]ni=nk,则
nk=nk––−k−1∑i=0(−1)k−i[ki]ni
对其求和,有:
Sk(n)=n∑i=1ik=n∑i=1{ik––−k−1∑j=0(−1)k−j[kj]ij}
拆开求和符号。
对于第一项,转化为组合数。
使用组合数性质合并,再展开组合数,有:
n∑i=1ik––=k!n∑i=1ik––k!=k!n∑i=1(ik)=k!(n+1k+1)=(n+1)k+1–––––k+1
对于第二项,只有 ij 与 i 有关,交换求和符号,有:
k−1∑j=0(−1)k−j[kj]n∑1ij=k−1∑i=0⋅[ki]⋅Si(n)
得证。
复杂度
复杂度 O(k2)。
需要预处理 k2 个第一类斯特林数。
再递推求得 S0(n),S1(n)…Sk(n),单次复杂度为 O(k)。
优缺点
优点:模数可以为任意值,摆脱了质数的限制。
第一项 (n+1)k+1–––––k+1 看起来要求逆元,但 (n+1)k+1––––– 展开后至少有一项为 k+1 的倍数。
枚举 n+1−? 到 k+1 的倍数时直接除去 k+1即可。
缺点:TLE 警告。
伯努利数
?e 和 ∞ 是个什么玩意
?多项式求逆
爬了。
会了 NTT 再回来
题目
CF622F The Sum of the k-th Powers
n≤109,k≤106。
只能用复杂度与 n 无关的算法过去(
写在最后
?我也不知道为什么叫差分法
可能是因为证明的时候用了 n∑i=1{(i+1)d+1−id+1}。
63 级学弟学妹来啦!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix