【思考题】great cells(数学)

【思考题】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 long
using 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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值