2016 China Final H

/*************************************************************************
    > 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
",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
",res);    
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/7955434.html