P4948
记
则使用错位相减法,有
上下相减,则
然后那个
运用这个结论,可以得到
然后求和符号换一下,我们就可以把对
然后你发现没法优化了。
但是你发现
这不就是题目要求的式子吗,只不过
那么我们就努力凑出这样一个形式吧!这样就能递推求解了。
观察到他的
别忘了这个式子是
但是你发现
考虑如果
发现我们在好多地方都要除以
时间复杂度
#include<bits/stdc++.h>
#define fs(i,x,y,z) for(register int i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(register int i=x;i>=y;i+=z)
#define int long long
#define db double
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=200001,inf=1e9+7;
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=(date<<3)+(date<<1)+(c^48);c=getchar();}
return date*w;
}
int ksm(int a,int b){
a%=inf;
int ans=1ll;while(b){if(b&1)ans=ans*a%inf;a=a*a%inf;b=b>>1ll;}
return ans;
}
int fac[N+1],inv[N+1],k,f[N],e;
int c(int d,int u){return fac[d]*inv[u]%inf*inv[d-u]%inf;}
signed main(){
fac[0]=inv[0]=1;
fs(i,1,N,1) fac[i]=fac[i-1]*i%inf;
inv[N]=ksm(fac[N],inf-2);
ft(i,N-1,1,-1) inv[i]=inv[i+1]*(i+1)%inf;
int n=read(),a=read(),k=read();e=ksm(a-1,inf-2);
f[0]=a*e%inf*(ksm(a,n)-1+inf)%inf;
fs(i,1,k,1){
int cur=1-2*bool(i&1);f[i]=(ksm(n,i)*ksm(a,n+1)%inf-a+inf)%inf;
//左边的式子
fs(j,0,i-1,1){
f[i]=(f[i]+c(i,j)*cur*(f[j]-a)+inf)%inf;
cur*=-1;
}
f[i]=(f[i]+inf)%inf*e%inf;
//这里是(a-1)S,要除以a-1
}
cout<<f[k];
return 0;
}