[UESTC 1805] 矩阵

∥☆過路亽.° 提交于 2020-04-09 17:59:56

题目描述:
题目链接: UESTC 1805 矩阵
题目大意:
求有多少个不相同的,大小为N×M的矩阵使得每一行元素的乘积和每一列元素的乘积均为K(K=1或-1)。
输入格式:
输入只有一行,三个数字N,M,K。(1≤N≤6,1≤M≤7,K=1或者−1)
输出格式:
输出一个数字,即满足条件的不同矩阵的数量。
样例输入:







2 2 1

样例输出:

2

题目分析:
这道题本身数据较小,可以暴力过,虽然我觉得暴力也不好写。还是推导一下正解:
首先当K=1时,对于N×M的矩阵,假设已有一个任意的(N-1)×(M-1)的矩阵。我们先考虑行,无论第i行的M-1个元素的乘积是1还是-1,我们都可以在对应的第i行的第M列填上1或-1,使得第i行的乘积为1。同样的,对于每一列,我们也可以在这一列的第M行填上1或-1,使得这一列的乘积为1。这样前N-1行和M-1列就满足条件了。现在来考虑第N行和第M列,事实上,前面填上的第N行的前M-1个元素和第M列的前N-1个元素乘积是一样的,所以在第N行第M列的位置可以填上相应的1或-1,使得第N行和第M列的乘积都是1。
那么可得到结论:对于任意的(N-1)×(M-1)的矩阵都可找到唯一的与之对应的符合题目要求的N×M的矩阵。所以答案就是 2 ( n − 1 ) ( m − 1 ) 2^{(n-1)(m-1)} 2(n1)(m1)
现证明第N行的前M-1个元素和第M列的前N-1个元素乘积相等:
前N-1行的乘积=前M-1列的乘积=1。(因为每一行每一列的乘积都是1)
而前N-1行的乘积=[(N-1)×(M-1)矩阵所有元素的乘积]×[第M列的前N-1个元素乘积];
前M-1列的乘积=[(N-1)×(M-1)矩阵所有元素的乘积]×[第N行的前M-1个元素乘积],所以得证。
而对于K=-1,推导过程一样,结论一样。
但是当n和m的奇偶情况不一样时不成立。因为此时前N-1行的乘积和前M-1列的乘积不等(因为每一行每一列的积都是-1,而此时N-1和M-1奇偶性不同,则总乘积不同),所以第N行的前M-1个元素和第M列的前N-1个元素乘积不等。那么在第N行第M列的位置填上1或-1都不能使得第N行和第M列的乘积同时为-1。
所以此时,对于任意的(N-1)×(M-1)的矩阵都找不到对应的符合题目要求的N×M的矩阵。所以答案就是0。
附代码:










#include<iostream>
using namespace std;

int n,m,k;
long long ans;

int main()
{
	scanf("%d%d%d",&n,&m,&k);
	
	if(k==-1&&(n+m)%2==1) printf("0");
	else 
	{
		ans=1;
		for(int i=1;i<=n-1;i++)
			for(int j=1;j<=m-1;j++)
				ans*=2; 
		printf("%lld",ans);
	}

	return 0;	
} 
发布了100 篇原创文章 · 获赞 8 · 访问量 3万+
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!