CF894B Ralph And His Magic Field
题解
观察数据范围,发现 \(k\) 的值只为 \(1\) 或 \(-1\),所以每行填的数只能是 \(1\) 或 \(-1\),而 \(-1\) 又可以直接改变当前乘积的符号,所以,在矩阵 \((n-1,m-1)\) 中,填 \(1\) 或 \(-1\) 均可,然后在最后一行和最后一列填上 \(1\) 或 \(-1\) 使其乘积等于 \(k\) 即可。
根据乘法原理,最后的答案即为 \(2^{(n-1)(m-1)}\)。
前面讨论的是有答案的情况,那么现在我们来讨论无解的情况,不难发现,当 \(n\) 和 \(m\) 为一奇一偶,且 \(k=-1\) 时,无解,因为当我们在填最后一行和最后一列时,最右下角的数既会影响行也会影响列,所以有可能无解,如下图:
此时 \(k=-1\),无解。
注意
我们计算答案时要用两次乘方算,因为 \((n-1)(m-1)\) 会爆 long long,由于指数较大,还要用到快速幂。
Code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
void read(int &x)
{
char ch=getchar();
int r=0,w=1;
while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
x=r*w;
}
const int mod=1e9+7;
int get(int a,int b)//快速幂
{
int ans=1;
while(b)
{
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
main()
{
int n,m,k;
read(n);
read(m);
read(k);
if(abs(n-m)%2==1&&k==-1)cout<<0;//无解
else cout<<get(get(2,n-1),m-1);
return 0;
}