题目描述:
题目链接: 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(n−1)(m−1)。
现证明第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;
}
来源:oschina
链接:https://my.oschina.net/u/4343285/blog/3226449