【思考题】great cells(数学)

来源:互联网 发布:哪里有卖淘宝买家信息 编辑:程序博客网 时间:2024/06/03 13:49

【思考题】great cells(数学)

【题目链接】https://odzkskevi.qnssl.com/e4ddab4bbddb4d48602cd7ef31d6c6fa?v=1504573247
H题


题目内容

这里写图片描述
这里写图片描述


题目大意

有n行m列格子,可以填的数是1-g,如果一个数比它所在行列的其他所有数都大,这个数是great number,Ag表示有g个great number 的情况。求:这里写图片描述


解题思路

把原式拆分成(A0+A1+……+Ag)+(1*A1+2*A2+……+g*Ag),前半部分即为g的n*m次方,后半部分每一项都是 great number数 乘 情况数,相当于鸡蛋数 乘 装鸡蛋的篮子数 等于 总鸡蛋数,所以后半部分可以转化成每个数在每一位置成为great number 的次数。
后半部分具体转化为g^(m-1) * (n-1) * (1^(m+n_2) + 2^(m+n-2) + …… + (g-1)^(m+n-2))。
公式是从二开始的,对于小数据要特判。


AC代码

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<algorithm>#include<math.h>#include<limits.h>#include<stack>#include<queue>#define LL long longusing namespace std;const LL mod=1e9+7;LL fast_power(LL a,LL b){    LL ans=1;    while(b>0)    {        if(b&1) ans=ans*a%mod;        a=a*a%mod;        b>>=1;    }    return ans;}int main(){    int t;    LL n,m,g;    scanf("%d",&t);    for(int kk=1;kk<=t;kk++)    {        scanf("%lld%lld%lld",&n,&m,&g);        if(n==1&m==1)        {            printf("Case #%d: %lld\n",kk,2*g);            continue;        }        if(g==1)        {            printf("Case #%d: 1\n",kk);            continue;        }        LL a,b,c=0;        a=fast_power(g,n*m);        b=fast_power(g,(n-1)*(m-1));        for(LL i=1;i<g;i++)        {            c+=fast_power(i,m+n-2);            c%=mod;        }        c=c*n*m%mod;        LL ans=a+b*c%mod;        ans%=mod;        printf("Case #%d: %lld\n",kk,ans);    }}