[斯特林数][自然数幂和]JZOJ 4220 WYF的盒子
分析
不会数学公式,不方便打,不妨看ZZY大爷的吧
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const ll C=1e6; ll k,n,m,p,s[2010][2010]; ll Multi(ll a,ll b) { ll x=a%C,y=b%C,ax=a/C,ay=b/C; return (x*y%p+x*ay%p*C%p+y*ax%p*C%p+ax*ay%p*C%p*C%p)%p; } //AntiExplodeMulti ll Power(ll x,ll y) {ll ans=1;for (;y;y>>=1,x=Multi(x,x)) if (y&1) ans=Multi(ans,x);return ans;} void Pre_Process() { s[0][0]=1; for (int i=1;i<=k;++i) for (int j=1;j<=i;++j) s[i][j]=(s[i-1][j-1]+Multi(j,s[i-1][j]))%p; } ll Calc(ll x) { ll ans=0; for (int i=0;i<=k;++i) { ll pow=s[k][i]; for (ll j=x-i+1;j<=x+1;++j) pow=Multi(pow,j%(i+1)==0?j/(i+1):j); ans=(ans+pow)%p; } return ans; } int main() { scanf("%lld%lld%lld%lld",&k,&n,&m,&p); ll ans=0; if (n-m<=5000ll) for (ll i=n;i>=m;--i) ans=(ans+Power(i,k))%p; else { Pre_Process(); ans=((Calc(n)-Calc(m-1))%p+p)%p; } printf("%lld",ans); }
在日渐沉没的世界里,我发现了你。