TJOI2018出CF原题弱化版是不是有点太过分了?对,就是 TJOI2018 教科书般的亵渎
然而我这个问题只会那个题的范围的m^3做法
回忆一下1到n求和是二次的,平方求和公式是三次的,立方求和公式是四次的,那m次方求和公式一定是个m+1次多项式
直接扔m+2个值进去把它插出来,因为是连续的可以做到线性(不算逆元)
1 #include<cstdio> 2 const int N=1e6+60,mod=1e9+7; 3 int n,k,ans,sum,fac[N],pre[N],suf[N]; 4 int Qpow(int x,int k) 5 { 6 if(k<=1) return k?x:1; 7 int tmp=Qpow(x,k>>1); 8 return 1ll*tmp*tmp%mod*((k&1)?x:1)%mod; 9 } 10 int main() 11 { 12 scanf("%d%d",&n,&k); 13 fac[0]=pre[0]=suf[k+3]=1; 14 for(int i=1;i<=k+2;i++) fac[i]=1ll*fac[i-1]*i%mod; 15 for(int i=1;i<=k+2;i++) pre[i]=1ll*pre[i-1]*(n-i+mod)%mod; 16 for(int i=k+2;i;i--) suf[i]=1ll*suf[i+1]*(n-i+mod)%mod; 17 for(int i=1;i<=k+2;i++) 18 { 19 sum=(sum+Qpow(i,k))%mod; 20 int fz=1ll*pre[i-1]*suf[i+1]%mod; 21 int fm=1ll*fac[i-1]*fac[k+2-i]%mod; 22 (ans+=1ll*sum*fz%mod*Qpow(((k-i)&1)?mod-fm:fm,mod-2)%mod)%=mod; 23 } 24 printf("%d",ans); 25 return 0; 26 }