題目連接:php
http://codeforces.com/gym/101194/attachmentsc++
題意:code
給出 $N$ 行 $M$ 列的網格,每一個格子內能夠填入 $[1,K]$ 內的任意整數。blog
若是某個格子,它是它所在行上嚴格最大的,同時也是所在列上嚴格最大的,則認爲這個格子是好格子。ci
對於一個非負整數 $g$,能夠有 $A_g$ 種填法使得網格內好格子數目正好爲 $g$。get
如今要求 $\sum_{g=0}^{NM}(g+1) A_g$,輸出答案模 $1e9+7$ 後的結果。it
題解:io
首先,一個 $N \times M$ 的網格最多有 $\min(N,M)$ 個好格子,不可能更多了,所以 $\sum_{g=0}^{NM}(g+1) A_g = \sum_{g=0}^{\min(N,M)}(g+1) A_g$。class
又 $\sum_{g=0}^{\min(N,M)}(g+1) A_g = \sum_{g=0}^{\min(N,M)}g\cdot A_g + \sum_{g=0}^{\min(N,M)} A_g$,
顯然,$\sum_{g=0}^{\min(N,M)} A_g$ 即 $[1,K]$ 內的數無限制任意填入網格的全部填法數目 $K^{NM}$。
那麼剩下來就是求 $\sum_{g=0}^{\min(N,M)}g\cdot A_g$:
單獨考慮 $g \cdot A_g$ 的意義,如今我每一種能產生 $g$ 個好格子的方案,都要乘上一個 $g$。至關於對這 $g$ 個格子裏的每一個格子都累計上一個方案數 $A_g$。
那麼換言之,$\sum_{g=0}^{\min(N,M)} A_g$ 就至關於,對每一個格子讓其成爲好格子的方案數的累加。
而某一個格子,能夠使得它成爲好格子的填法有 $\sum_{i=2}^{K}(i-1)^{n-1+m-1}\cdot K^{(N-1)(M-1)}$ 種,
總共 $N \times M$ 個好格子,所以 $\sum_{g=0}^{\min(N,M)}g\cdot A_g = NM \sum_{i=2}^{K}(i-1)^{n-1+m-1}\cdot K^{(N-1)(M-1)}$。
綜上,答案爲 $\sum_{g=0}^{NM}(g+1) A_g = K^{NM} + NM \sum_{i=2}^{K}(i-1)^{n-1+m-1}\cdot K^{(N-1)(M-1)}$。
AC代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e9+7; int n,m,k; ll fpow(ll a,ll n) { ll res=1,base=a%mod; while(n) { if(n&1) res*=base, res%=mod; base*=base, base%=mod; n>>=1; } return res%mod; } int main() { int T; cin>>T; for(int kase=1;kase<=T;kase++) { cin>>n>>m>>k; ll ans=0; for(int i=2;i<=k;i++) { ans+=fpow(i-1,n+m-2)*fpow(k,(n-1)*(m-1))%mod; ans%=mod; } ans*=(n*m)%mod, ans%=mod; ans+=fpow(k,n*m), ans%=mod; printf("Case #%d: %lld\n",kase,ans); } }