# 倍增

f(n,k)=f(n1,k)+nk$f(n,k)=f(n-1,k)+n^k$

f(n,k)=f(n/2,k)+n/2i=1kj=0Cjkij(n/2)kj$f(n,k)=f(n/2,k)+\sum_{i=1}^{n/2}\sum_{j=0}^kC_k^j*i^j*(n/2)^{k-j}$

f(n,k)=f(n/2,k)+kj=0Cjkf(n/2,j)(n/2)kj$f(n,k)=f(n/2,k)+\sum_{j=0}^kC_k^j*f(n/2,j)*(n/2)^{k-j}$

# 第一类斯特林数

Sk(n)=i=0nik

f(x,n)=k=0nss(n,k)xk

ss(n,m)=ss(n1,m1)(n1)ss(n1,m)$s_s(n,m)=s_s(n-1,m-1)-(n-1)*s_s(n-1,m)$

su(n,n)=1$s_u(n,n)=1$
su(n,0)=0$s_u(n,0)=0$

k!Ckj=f(j,k)$k!*C_j^k=f(j,k)$

jk=k!Ckjf(j,k)+ss(k,k)jk

jk=k!Ckj(f(j,k)ss(k,k)jk)

f(j,k)ss(k,k)jk=i=0kss(k,i)jiss(k,k)jk

f(j,k)ss(k,k)jk=i=0k1ss(k,i)ji

jk=k!Ckji=0k1ss(k,i)ji

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

Sk(n)=k!j=0nCkji=0k1(1)i+ksu(k,i)j=0nji

Sk(n)=k!Ck+1n+1i=0k1(1)i+ksu(k,i)j=0nji

Sk(n)=f(n+1,k+1)k+1i=0k1(1)i+ksu(k,i)j=0nji

#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
ll su[2000+10][2000+10],f[2000+10];
ll i,j,k,l,t,n,m,p;
ll qsc(ll x,ll y){
ll a1=x/1000000,a2=x%1000000,b1=y/1000000,b2=y%1000000;
ll t=a1*b1%p*1000000%p*1000000%p;
t=(t+a2*b2%p);
t=(t+a1*b2%p*1000000%p);
t=(t+a2*b1%p*1000000%p);
return t%p;
}
ll qsm(ll x,ll y){
if (!y) return 1;
ll t=qsm(x,y/2);
t=qsc(t,t);
if (y%2) t=qsc(t,x);
return t;
}
ll get(ll n){
if (!n) return 0;
if (n<=k){
t=0;
fo(i,1,n){
l=1;
fo(j,1,k)
l=qsc(l,i);
t=(t+l)%p;
}
return t;
}
fo(i,0,k) f[i]=0;
if (n%2==0) f[1]=qsc(n/2,n+1);
else f[1]=qsc(n,(n+1)/2);
f[1]=(f[1]+1)%p;
f[0]=n%p;
fo(i,2,k){
t=1;
fo(j,n+1-i,n+1)
if (j%(i+1)==0) t=qsc(t,j/(i+1));else t=qsc(t,j);
f[i]=t;
fo(j,0,i-1){
if ((j+i)%2==0) l=1;else l=-1;
f[i]=((f[i]-qsc(l*su[i][j],f[j]))%p+p);
}
f[i]=f[i]%p;
}
return ((f[k]-1)%p+p)%p;
}
int main(){
scanf("%lld%lld%lld%lld",&k,&n,&m,&p);
if (n-m<=5000){
t=0;
fo(i,m,n) t=(t+qsm(i,k));
printf("%lld\n",t%p);
return 0;
}
su[0][0]=1;
fo(i,1,k) su[i][0]=0,su[i][i]=1;
fo(i,1,k)
fo(j,1,i-1)
su[i][j]=(su[i-1][j-1]+qsc(i-1,su[i-1][j]));
printf("%lld\n",((get(n)-get(m-1))%p+p)%p);
} 

#### [51nod1228][伯努利数][自然数k次幂和]序列求和

2017-02-27 08:54:31

#### 拉格朗日插值法(求自然数幂和)

2017-10-06 16:10:11

#### 51nod 1258 序列求和 V4 拉格朗日插值法求自然数幂和

2017-10-07 14:49:17

#### 高效求解自然数k次幂和的方法

2016-03-21 20:19:46

#### 求自然数幂和的各种方法（还有坑）

2016-03-18 19:00:45

#### 高效幂运算（JAVA）--拆分解法、二进制解法

2017-11-09 20:47:46

#### 【拉格朗日插值法求自然数幂和】

2017-07-17 22:21:07

#### 伯努利数与自然数幂和

2014-09-01 09:56:11

#### 高效的求幂运算

2012-04-26 20:58:59

#### 大数幂模运算

2017-05-25 12:05:27