提交时间:2022-07-20 11:52:27

运行 ID: 52769

#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; const int maxn=1010; int fpow(int n,int m,int x=1){ for(;m;m>>=1,n=n*1ll*n%mod) if(m&1) x=x*1ll*n%mod; return x; } void update(int &x,int y){if((x+=y)>=mod)x-=mod;} int f[2][maxn][maxn],g[2][maxn][maxn]; int n,m,k,ans,Pow[maxn]; int main(){ cin>>n>>k>>m; for(int i=1;i<=n;i++) Pow[i]=fpow(i,m); for(int i=0;i<=k;i++){ memset(f[i&1],0,sizeof(f[i&1])); memset(g[i&1],0,sizeof(g[i&1])); g[0][0][0]=1; for(int j=1;j<=n;j++){ for(int u=i;u<=min(n,i*j);u++){ if(u>=j)update(g[i&1][j][u],g[i&1^1][j][u-j]); update(g[i&1][j][u],g[i&1][j-1][u]); if(u>=j)update(f[i&1][j][u],(f[i&1^1][j][u-j]+g[i&1^1][j][u-j]*1ll*Pow[j])%mod); update(f[i&1][j][u],f[i&1][j-1][u]); } } } printf("%d\n",f[k&1][n][n]); return 0; }