题意:
有一张N*M的格子纸,每个格子可以填1到K之间的数。如果一个格子里的数严格大于本行的其他格子里的数,并且严格大于本列的的其他格子里的数,则这个格子叫做Great Cell。Ag表示有Ag种填法使得格子纸中恰有g个Great Cell。
求:
将上面的式子拆开
那么前一项就可以理解为每当格子为Great Cell时就加1,也就是每个格子Great Cell的次数
当前格子填 i 时,同行列只能填 i 以下的数,其他格子任意填
而后一项则是所有填法的和
但是上述式子对n和m同时为1时不成立,因为只有一个格子不会有A0,所以要单独讨论
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll qpow(ll x,ll n)
{
ll ans=1;
while(n)
{
if (n&1) ans=ans*x%mod;
x=x*x%mod;
n>>=1;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
printf("Case #%d: ",ca);
if (n==1&&m==1)
{
printf("%lld\n",k);
continue;
}
ll ans=0;
for(int i=1;i<k;i++)
ans=(ans+n*m*qpow(i,n+m-2)%mod)%mod;
ans=(ans*qpow(k,(n-1)*(m-1)))%mod;
ans=(ans+qpow(1LL*k,1LL*n*m))%mod;
printf("%lld\n",ans);
}
return 0;
}