题意
∑i=1nimmodp
暴力
呵呵,快速幂
高斯消元
从k次,推到k+1次,求系数
矩阵乘法
有点复杂,向下面的算法一样,可以从k次,推到k+1次
倍增
像快速幂一样,打一个f[i][j]
拉格朗日插值法
就是设一个函数再把式子推出来。道理很简单,不细讲。
如需了解差分表,拉格朗日插值法
牛顿插值法
还不会
差分表
我们知道式子a
(n+1)k+1−nk+1=C1k+1∗nk+……+Ckk+1∗n+1
(二项式定理)
那么我们转换到
(n+1)k+1−1=∑i=0n(i+1)k+1−ik+1
根据式子a
我们可以得到
(n+1)k+1−1=C1k+1∑i=0nik+……+Ckk+1∑i=0ni+n+1
进一步得到
式子b
∑i=0nik=1k+1[(n+1)k+1−C2k+1∑i=0nik−1−……−Ckk+1∑i=0ni−n−1]
很明显这些式子与所有的1到n的1到k-1次幂有关,所以是一个递推式
设
S(n,k)=∑i=nnik
用s代替式子b中的部分
S(n,k)=1k+1[(n+1)k+1−C2k+1S(n,k−1)−……−Ckk+1S(n,1)−n−1]
我们初始化s(n,0)=n+1(因为题目要求0^0=1),s(n,1)=n(n+1)/2
那么就可以递推着做自然数幂和了。
伯努利数
伯努利数原本就是处理等幂和的问题。
可以推得
∑i=1nik=1k+1∑i=1k+1Cik+1∗Bk+1−i∗(n+1)i
因为
∑k=0nCkn+1Bk=0(B0=1)
所以
Bn=−1n+1(C0n+1B0+C1n+1B1+……Cn−1n+1Bn−1)
伯努利数的证明十分复杂,有些东西其实可以不用弄懂,当做一个黑盒算法。
公式简单易记。
第一类斯特林数(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!Ckj−∑i=0k−1(−1)i+ks(k,i)ji)
拆括号
=k!∑j=0nCkj−∑i=0k−1(−1)i+ks(k,i)∑j=0nji
因为
∑mi=0Cni=Cn+1m+1(证明:Cn+1m+1=Cnm+Cn+1m,那么等式两边就把Cnm消掉了
,然后Cn+1m=Cm−1n+Cn−1m−1,然后又把Cnm−1消掉了,依此类推,最后全部都消掉了)
=k!Cn+1k+1−∑i=0k−1(−1)i+ks(k,i)Si(n)
在转换为用排列数的
=Pk+1n+1k+1−∑i=0k−1(−1)i+ks(k,i)Si(n)
那么我们只需要用
O(k2) 地预处理出第一类斯特林数,然后按k来递推了,边界是
S1(n)=n(n+1)/2
主要运用了第一类斯特林数与排列式P的关系。
第一类斯特林数处理自然数幂和的问题比伯努利数和差分表更好。虽然时间复杂度都是一样的,但是第一类斯特林数没有除号(用组合数的形式没有,但是排列数的形式也可以整除),不用考虑模数有没有逆元,但是差分表和伯努利数都是带除号的,模数没有逆元很容易GG,比如说有一道题叫做 小学生数学题
关系
转载并详细解说自GEOTCBRL%%%
打blog的灵感来自看了WerKeyTom_FTD
不过自我感觉十分详细。