秀秀的照片
Description
华华在和秀秀视频时有截很多图。华华发现秀秀的每一张照片都很萌很可爱。为什么会这样呢?华华在仔细看过秀秀的所有照片后,发现秀秀的照片都具有一个相同的性质。
设秀秀的分辨率为m×nm×n,即在水平方向上每一行有mm个像素,垂直方向上每一列有nn个像素,照片共有m×nm×n个像素。每一个像素都有一个颜色,共有kk种颜色。华华宝宝发现无论是沿着哪两列像素的分界线将秀秀的照片分成左右两半(共有m−1m−1种分法),左右两半不同颜色的种数都是相同的。
华华宝宝把自己的发现告诉了秀秀宝宝。现在秀秀想知道当照片分辨率为m×nm×n,像素颜色种数为kk(不一定kk种颜色都出现)的时候,共有多少张不同的照片满足上面的性质。
由于答案可能很大,你只需输出答案对109+7109+7取模的结果即可。
题解
代码
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
const int mod=1e9+7;
const int maxn=2003;
int n,m,k,s[maxn][maxn];
long long ans,inv[1000003],jie[1000003];
long long qpow(long long a,long long b){
long long ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod; b>>=1;
}
return ans;
}
long long C(long long a,long long b){return jie[a]*inv[b]%mod*inv[a-b]%mod;}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
jie[0]=1; for(int i=1;i<=k;++i) jie[i]=jie[i-1]*i%mod;
inv[k]=qpow(jie[k],mod-2); for(int i=k-1;i>=0;--i) inv[i]=inv[i+1]*(i+1)%mod;
s[0][0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j) s[i][j]=(s[i-1][j-1]+s[i-1][j]*j%mod)%mod;
for(int i=0;i<=min(n,k);++i)
for(int j=0;i+j<=n&&i+j+j<=k;++j)
{
long long tmp1=C(k,i)*qpow(i,(m-2)*n)%mod;
long long tmp2=C(k-i,j)*C(k-i-j,j)%mod;
long long tmp3=1ll*s[n][i+j]*jie[i+j]%mod;
long long tmp4=tmp3*tmp3%mod;
long long tmp5=tmp1*tmp2%mod;
ans=(ans+tmp5*tmp4%mod)%mod;
}
cout<<ans<<'\n';
return 0;
}