解决自然数幂和的方法

题意

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(i+1)k+1ik+1

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

进一步得到 式子b
i=0nik=1k+1[(n+1)k+1C2k+1i=0nik1Ckk+1i=0nin1]

很明显这些式子与所有的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=1nik=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,Cnm
Cn+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的关系。
第一类斯特林数处理自然数幂和的问题比伯努利数和差分表更好。虽然时间复杂度都是一样的,但是第一类斯特林数没有除号(用组合数的形式没有,但是排列数的形式也可以整除),不用考虑模数有没有逆元,但是差分表和伯努利数都是带除号的,模数没有逆元很容易GG,比如说有一道题叫做 小学生数学题

关系

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值