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;
}
posted @ 2022-07-06 11:34  Epoch_L  阅读(18)  评论(0编辑  收藏  举报