解决自然数幂和的方法

来源:互联网 发布:淘宝全棉时代有假货吗 编辑:程序博客网 时间:2024/05/01 19:41

题意

i=1nimmodp

暴力

呵呵,快速幂

高斯消元

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

矩阵乘法

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

倍增

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

拉格朗日插值法

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

牛顿插值法

还不会

差分表

我们知道式子a

(n+1)k+1nk+1=C1k+1nk++Ckk+1n+1
(二项式定理)
那么我们转换到
(n+1)k+11=i=0n(n+1)i+1ni+1

根据式子a
我们可以得到
(n+1)k+11=C1k+1i=nnik++Ckk+1i=nni+n+1

进一步得到式子b
i=nnik=1k+1[(n+1)k+1C2k+1i=nnik1Ckk+1i=nnin1]

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

S(n,k)=i=nnik

用s代替式子b中的部分
S(n,k)=1k+1[(n+1)k+1C2k+1S(n,k1)Ckk+1S(n,1)n1]

我们初始化s(n,0)=n+1(因为题目要求0^0=1),s(n,1)=n(n+1)/2
那么就可以递推着做自然数幂和了。
如需了解差分表,请转差分表

伯努利数

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

i=nnik=1k+1i=1k+1Cik+1Bk+1i(n+1)i

因为
k=0nCkn+1Bk=0(B0=1)

所以
Bn=1n+1(C0n+1B0+C1n+1B1+Cn1n+1Bn1)

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

第一类斯特林数(Stirling)

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

Sk(n)=i=0nik

根据第一类斯特林数的定义(P是排列数,C是组合数,s是Stirling)
Ckn=Pknk!=ki=0(1)i+ks(k,i)nik!

那么我们用P每次减去一个少一位的对应斯特林式子就得到了jk,在求和就是Sk(n)
所以
Sk(n)=

j=0n(k!Ckji=0k1(1)i+ks(k,i)ji)

拆括号
=k!j=0nCkji=0k1(1)i+ks(k,i)j=0nji

因为mi=0Cni=Cn+1m+1Cn+1m+1=Cnm+Cn+1m,CnmCn+1m=Cm1n+Cn1m1,Cnm1
=k!Cn+1k+1i=0k1(1)i+ks(k,i)Si(n)

在转换为用排列数的
=Pk+1n+1k+1i=0k1(1)i+ks(k,i)Si(n)

那么我们只需要用O(k2)地预处理出第一类斯特林数,然后按k来递推了,边界是S1(n)=n(n+1)/2
主要运用了第一类斯特林数与排列式P的关系。
不知道WerKeyTom_FTD为什么搞出个带不带符号那么麻烦……

关系

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

1 0
原创粉丝点击