这个题目是个思维题,同时包含着快速幂运算,规律找出来后用个快速幂的板子很好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;
}