Codeforces--477Div.2--B

题目

这个题目是个思维题,同时包含着快速幂运算,规律找出来后用个快速幂的板子很好AC

题意:
题目给出m x n的网格,要求每行每列相乘都是等于1或者-1
可以很快得出每个格子只能填-1或者1(题目中要求是整数),那么我们也可以知道的是,每一行每一列的乘积应该是取决于最后一个填入网格的数字,假设一列中有n个数字,那么前n-1个数字是随意填1或者-1的,第n个数字就必须为一个定值。初步可以得出的结论是:方法的种类有2^(m-1)* (n-1)种。

但题目的坑点不在此!

我们必须注意的是当m+n为奇数,k=-1时必然导致有一行或者一列出现两个-1,所以这种情况是不存在的,此时应该输出0。

AC代码:

#include<cstdio>
typedef long long LL;
const int M=1000000007;
LL quickmi(LL a,LL b)
{
    LL ans =1,vis=a ;
    while(b)
    {
        if(b&1)
        ans=(vis%M*ans%M)%M;     \\一开始没注意取模,干脆...我都取了模
        vis=((vis%M)*(vis%M))%M;
        b>>=1;
    }
    return ans;
}
int main()
{
    LL m,n,k;
    scanf("%I64d%I64d%I64d",&m,&n,&k);
    if(k==-1&&((m+n)%2)==1)
    {
        printf("0\n");
    }
    else
    {
        LL anser=quickmi(2,n-1);     //值得注意的是,m,n的范围最大到10^18
        anser=quickmi(anser,m-1);    //所以相乘会爆掉long long 所以进行了两次操作
        printf("%I64d",anser);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/78648219