C++,Lutece 1805 矩阵

/*
Migrated from Lutece 1805 矩阵
Description
小明发现了一种特殊的N×M的矩阵,矩阵里的元素都是1或−1。
假设A_i为第i行(1≤i≤N) 所有元素的乘积,B_j为第j列(1≤j≤M) 所有元素的乘积。
喜欢搞事情的小明突发奇想,想知道有多少个不相同的,
大小为N×M的矩阵使得所有A_i,B_j都是K的(K=1或者−1)。
当且仅当两个矩阵存在一个元素不相同时两个矩阵不相同。

Input
输入只有一行,三个数字N,M,K。(1≤N≤6,1≤M≤7,K=1或者−1)

Output
输出一个数字,即满足条件的不同矩阵的数量
*/
/*
矩阵所有元素的乘积应等于所有A_i的乘积, 也等于所有B_j的乘积
若k=-1,则N和M的奇偶性必须相同, 否则A_i的乘积和B_j的乘积不可能相等
//先保留第一行和第一列为空, 先设置剩余的N-1行*M-1列的元素,
//共(N-1)*(M-1)个元素, 每个元素有两种选择, 1或-1, 所以共有2^(N-1)*(M-1)种可能
//对每种可能, 根据要求乘积是1还是-1,和已决定的元素, 确定第一列和第一行的元素
//使得除了第一行和第一列之外的所有行和所有列从乘积满足要求
//除了第一行和第一列相交的元素之外, 为满足乘积要求, 第一行和第一列的所有其它元素只有一种选择
//之后还剩第一行和第一列本身是否满足乘积要求
//由于第一行和第一列除了相交元素之外, 其它元素都是由(N-1)*(M-1)个元素决定的, 只有相交元素能调整
//所以第一行和第一列是否满足乘积要求要看相交元素是否能使第一行和第一列的乘积相同
//即要看第一行和第一列中已确定元素中-1的个数的奇偶性是否相等
//而第一行中-1的个数要看(N-1)*(M-1)中各列中需要补充-1的列数
//第一列中-1的个数要看(N-1)*(M-1)中各行中需要补充-1的行数
//即要看列数和行数的奇偶性是否相等
//而在向(N-1)*(M-1)区域中随机随机选择元素时
//  初始情况下,假设所有元素均为1
//  由上面知道当k=-1时,N和M的奇偶性相同,则此时要补充-1的行数为N,列数为M,行数和列数奇偶性相同
//  当k=1时,N和M没有特别要求,但所有行和列都无需补充-1, 因此行数和列数的奇偶性相同
//  因此,初始情况下,行数和列数的奇偶性相同
//  之后,若将某个1变为-1, 则该元素所在行和所在列是否需要补充-1的情况一定会发生改变,
//  也就是说需要补充-1的行数和列数要么+1,要么-1,行数和列数的变化不一定相同
//  无论行数列数的变化情况是(+1,+1),(-1,+1),(+1,-1),(-1,-1)哪种,行数和列数的奇偶性同时改变
//  由于初始情况下行数列数奇偶性相同,之后变化也是同时改变,
//  因此,行数和列数的奇偶性始终相同
//因此需要补充-1的行数和列数的奇偶性始终相同,
//即第一行和第一列中确定的元素中-1的个数的奇偶性相同
//因此第一行和第一列本身乘积的奇偶性相同,
//而改变交叉元素则会导致第一行和第一列的中-1个数的奇偶性同时改变
//因此第一行和第一列中-1个数的奇偶性始终相同
//可调整相交元素使得第一行和第一列的乘积相同且同时满足要求
//因此第一行和第一列一定能够满足乘积要求,并且相交元素也被确定,只有一种可能
//因此中国有2^(N-1)*(M-1)种可能,且每种可能都是满足要求的
*/
#include <iostream>
int main(){
    int N,M,K;std::cin>>N>>M>>K;
    if(K==-1 && N%2!=M%2){std::cout<<0;return 0;}
    std::cout<<(1<<(N-1)*(M-1));//2^(N-1)*(M-1)
    return 0;
}
posted @ 2025-03-19 21:48  Kazuma_124  阅读(37)  评论(0)    收藏  举报