UESTCOJ1805 矩阵

题目

UESTCOJ 矩阵
在这里插入图片描述

题解

思路分析

先给出一个 N × M N\times M N×M矩阵格子


在这里插入图片描述

其实我们观察可以知道:左上 ( N − 1 ) × ( M − 1 ) (N-1)\times (M-1) (N1)×(M1)矩阵中的数可以随机为-1或1,由最后一行与最后一列来确定下整行整列的乘积,而最终就只剩下右下角哪一个块需要确定了。


在这里插入图片描述

由上面的分析:我们将矩阵分区成四个部分(不同颜色的框),橙色框中随机,也就是说在没有条件限制时共 2 ( N − 1 ) ( N − 1 ) 2^{(N-1)(N-1)} 2(N1)(N1)种情况。现在由绿色框和紫色框来让前 ( N − 1 ) (N-1) (N1)行和 ( M − 1 ) (M-1) (M1)列满足乘积为 K . K. K.最后就只剩下黄色框了,黄色框取值时能否使得 N N N行和 M M M列满足乘积为 K K K呢?这又取决于绿色框和紫色框种元素的乘积值。
下面分析绿色框和紫色框中乘积的关系:
为了方便,我们对四个部分的元素乘积进行符号化:


在这里插入图片描述

求乘积分别为 ∏ A ∏ B ∏ C ∏ D . \prod_A \prod_B \prod_C \prod_D. ABCD.
如果 K = 1 K=1 K=1,很容易想到前 ( N − 1 ) (N-1) (N1)行和前 ( M − 1 ) (M-1) (M1)列的所有元素乘积为1,因为每行乘积为1.
即: ∏ A × ∏ C = 1 , ∏ A × ∏ B = 1. \prod_A \times\prod_C=1,\prod_A\times\prod_B=1. A×C=1,A×B=1.
⇒ ∏ B = ∏ C . \Rightarrow \prod_B=\prod_C. B=C.
这时我们知道:BC区域的乘积相同,所以D取1或-1中的一个可以使得乘积满足为1.

如果 K = − 1 K=-1 K=1,我们知道如果行列奇偶性形同,那么等同于 K = 1 K=1 K=1,但是!
如果 K = − 1 K=-1 K=1,但是行奇偶性不相同呢?可以得到以下不等式:
∏ A × ∏ C ≠ ∏ A × ∏ B . \prod_A \times\prod_C\neq \prod_A\times\prod_B. A×C=A×B.
⇒ ∏ B ≠ ∏ C . \Rightarrow \prod_B\ne \prod_C. B=C.
这时我们知道:无法找到一个D的值使得BC两个区域满足条件,这种情况下输出0即可(特判)

代码
#include<iostream>
using namespace std;
int main()
{
	int N,M,K;
	long long ans;
	cin>>N>>M>>K;
	if(K==-1&&(N+M)%2!=0) cout<<"0";
	else {
		ans=1;
		for(int i=1;i<=N-1;i++)
			for(int j=1;j<=M-1;j++)
				ans*=2; 
		cout<<ans;
	}
	return 0;	
} 
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值