/************************************************************************* > File Name: H.cpp > Author: LyuCheng > Created Time: 2017-12-02 19:29 > Description: 题意:一个n×m的矩阵,填[1,k]的数,一个格子如果是所在行,列,严格最 的,那么这个格子叫做Great cell,求segma(g=0...n*m)((g+1)*Ag) Ag是有g个Great cell的填法 思路:式子化简为 segma(g=0...n*m)(g*Ag)+segma(g=0..n*m)(Ag); 后一项就是所有Ag的和,也就是总的状态为 k^(n+m),前一项为 segma(g=0...n*m)(Ag+Ag+...Ag)(总共有g个) 也就是说每一个方案数 里面有g个Great cell,每一个Great cell对总结果贡献1,所以, 最后就是 所有格子作为Great cell的情况的总和 ************************************************************************/ #include <bits/stdc++.h> #define MOD 1000000007 #define LL long long using namespace std; int t; int n,m,k; LL res; inline LL power(LL a,LL b){ if(b==0) return 1; LL cnt=power(a,b/2); cnt=cnt*cnt%MOD; if(b&1) cnt=cnt*a%MOD; return cnt; } inline void init(){ res=0; } int main(){ scanf("%d",&t); for(int ca=1;ca<=t;ca++){ printf("Case #%d: ",ca); init(); scanf("%d%d%d",&n,&m,&k); if(n==1&&m==1){ printf("%d\n",2*k); continue; } res+=power(k,n*m); res%=MOD; for(int i=1;i<=k;i++){ res+=((n*m)%MOD*power(i-1,n+m-2)%MOD*power(k,(n-1)*(m-1))%MOD)%MOD; res%=MOD; } printf("%d\n",res); } return 0; }
时间: 2024-11-14 13:54:38