Gym 101194H / UVALive 7904 - Great Cells - [數學題+快速冪][2016 EC-Final Problem H]

題目連接:php

http://codeforces.com/gym/101194/attachmentsc++

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5926spa

 

題意: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);
    }
}
相關文章
相關標籤/搜索