[置顶] 求自然数幂和的各种方法(还有坑)

i=1nikmodp

高斯消元

一个定理,k次方和一定可以由0~k-1次方和表示出来,设方程组解出来就好了。
O(k3)

倍增

我们设

f(n,k)=i=1nik

怎么算呢?
我们采用分治思想。
如果n是奇数那么
f(n,k)=f(n1,k)+nk

否则,我们可以先求出n/2的f,然后对于n/2+1~n中的每个数都可以表示为n/2+i
那么
f(n,k)=f(n/2,k)+i=1n/2(n/2+i)k

二项式定理
f(n,k)=f(n/2,k)+i=1n/2j=0kCjk(n/2)kjij

调换一下
f(n,k)=f(n/2,k)+j=0kCkjf(n/2,j)(n/2)kj

O(k2lognlogk)

第一类斯特林数

参考WerKeyTom_FTD的blog

S(n,k)=i=1nik

引入 第一类斯特林数
Pnm=i=0nSs(n,i)mi

发现
jk=Ss(k,k)jk

于是
jk=k!CkjPkj+Ss(k,k)jk

jk=k!Ckj(PkjSs(k,k)jk)

观察括号内的式子
PkjSs(k,k)jk=i=0kSs(k,i)jiSs(k,k)jk

PkjSs(k,k)jk=i=0k1Ss(k,i)ji

于是
jk=k!Ckji=0k1Ss(k,i)ji

S(n,k)=j=1n(k!Ckji=0k1Ss(k,i)ji)

S(n,k)=k!j=1nCkji=0k1j=1nSs(k,i)ji

S(n,k)=k!Ck+1n+1i=0k1Ss(k,i)j=1nji

S(n,k)=Pk+1n+1k+1i=0k1Ss(k,i)S(n,i)

减号前面暴力做就好了。因为它是k+1个连续自然数相乘,必然会有k+1这个因数。预处理Ss,递推S。 O(k2)

你可能感兴趣的:(数论,高斯消元,自然数幂和,第一类斯特林数,倍增)