题意


解决自然数幂和的方法_第一类斯特林数

暴力

呵呵,快速幂

高斯消元

从k次,推到k+1次,求系数

矩阵乘法

有点复杂,向下面的算法一样,可以从k次,推到k+1次

倍增

像快速幂一样,打一个f[i][j]

拉格朗日插值法

就是设一个函数再把式子推出来。道理很简单,不细讲。
如需了解差分表,​​拉格朗日插值法​​

牛顿插值法

还不会

差分表

我们知道式子a

解决自然数幂和的方法_GDKOI_02

(二项式定理)


那么我们转换到


解决自然数幂和的方法_差分表_03


根据式子a


我们可以得到


解决自然数幂和的方法_伯努利数_04


进一步得到

式子b

解决自然数幂和的方法_自然数幂和_05


很明显这些式子与所有的1到n的1到k-1次幂有关,所以是一个递推式




解决自然数幂和的方法_GDKOI_06


用s代替式子b中的部分

解决自然数幂和的方法_伯努利数_07


我们初始化s(n,0)=n+1(因为题目要求0^0=1),s(n,1)=n(n+1)/2


那么就可以递推着做自然数幂和了。

伯努利数

伯努利数原本就是处理等幂和的问题。
可以推得

解决自然数幂和的方法_伯努利数_08


因为


解决自然数幂和的方法_伯努利数_09


所以


解决自然数幂和的方法_第一类斯特林数_10


伯努利数的证明十分复杂,有些东西其实可以不用弄懂,当做一个黑盒算法。


公式简单易记。

第一类斯特林数(Stirling)

其实第一类斯特林数的概念十分好懂。
如需了解第一类斯特林数,请转​​第一类斯特林数​​
首先我们设

解决自然数幂和的方法_GDKOI_11


根据第一类斯特林数的定义(P是排列数,C是组合数,s是Stirling)


解决自然数幂和的方法_伯努利数_12


那么我们用P每次减去一个少一位的对应斯特林式子就得到了

jk,在求和就是 Sk(n)。


所以


解决自然数幂和的方法_第一类斯特林数_13

拆括号


解决自然数幂和的方法_伯努利数_14


因为

解决自然数幂和的方法_伯努利数_15(证明:解决自然数幂和的方法_第一类斯特林数_16,那么等式两边就把Cnm消掉了

,然后解决自然数幂和的方法_差分表_17,然后又把Cnm−1消掉了,依此类推,最后全部都消掉了)

解决自然数幂和的方法_差分表_18


在转换为用排列数的


解决自然数幂和的方法_自然数幂和_19


那么我们只需要用

O(k2)地预处理出第一类斯特林数,然后按k来递推了,边界是 解决自然数幂和的方法_伯努利数_20

主要运用了第一类斯特林数与排列式P的关系。


第一类斯特林数处理自然数幂和的问题比伯努利数和差分表更好。虽然时间复杂度都是一样的,但是第一类斯特林数没有除号(用组合数的形式没有,但是排列数的形式也可以整除),不用考虑模数有没有逆元,但是差分表和伯努利数都是带除号的,模数没有逆元很容易GG,比如说有一道题叫做

​​小学生数学题​

关系

转载并详细解说自​​GEOTCBRL​​%%%
打blog的灵感来自看了​​WerKeyTom_FTD​​
不过自我感觉十分详细。