题解 P4948 【数列求和】
诶,我来搬运一下出题人的题解吧。
以下是我结合自己的理解所写,如有不对请大佬指出。
解析
观察到
设
那么有
观察到上式可以
代码如下
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define re register
#define LL long long
#define N 3005
using namespace std;
const int Mod=1e9+7;
LL n,a,k,power_a,c[N][N],inv_a,f[N];
LL power(LL x,LL P){
LL r=1; x%=Mod;
while(P){ if(P&1) r=r*x%Mod; x=x*x%Mod; P>>=1; }
return r;
}
int main(){
scanf("%lld%lld%lld",&n,&a,&k);
power_a=power(a,n+1);
for(re int i=0;i<=k;++i){
c[i][0]=1ll;
for(re int j=1;j<=i;++j) c[i][j]=(c[i-1][j-1]+c[i-1][j])%Mod;
}
inv_a=power(a-1,Mod-2);
f[0]=inv_a*a%Mod*(power(a,n)-1)%Mod;
for(re int i=1;i<=k;++i){
f[i]=power_a*power(n,i)%Mod-a;
for(re int j=i-1,t=-1;~j;--j,t=-t) f[i]=(f[i]+c[i][j]*t*(f[j]-a))%Mod;
f[i]=(f[i]+Mod)*inv_a%Mod;
}
printf("%lld\n",f[k]);
return 0;
}
后记
此题要点: