B. Ralph And His Magic Field

​从大佬那偷题,真香​题意: 给出你Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_c++的一个矩阵,每个方格里你可以放Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_解决方案_02或者Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_解决方案_03 要求构成每一行每一列的乘积都是Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_#include_04问你有几种

题解: 首先我们可以先分下类:

  1. k=1 ,n为奇数,m为奇数
  2. k=1 ,n为奇数,m为偶数
  3. k=1 ,n为偶数,m为奇数
  4. k=1 ,n为偶数,m为偶数
  5. k=-1 ,n为奇数,m为奇数
  6. k=-1 ,n为奇数,m为偶数
  7. k=-1 ,n为偶数,m为奇数
  8. k=-1 ,n为偶数,m为偶数
    一共就这八种。(其实是两种)
    当k=1时,那么我们就知道-1的数量一定是偶数(包括0)。
    所以每一行有Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_解决方案_05
    我们由二项式定理得:
    Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_解决方案_06
    还有Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_解决方案_07
    我们得到Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_c++_08
    (这个地方就可以看出k=1与k=-1并无太大的差别,但是后面还有一点不一样)
    所以我们可以得到Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_#include_09
    看完行,那我们看列其实就是Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_解决方案_10
    根据乘法定理得Codeforces -894B. Ralph And His Magic Field(组合数学+思维)_c++_11
    想证其他的可以证证。

这里说出特殊情况那个 : 6和7
即当k=-1时,(n+m)是奇数。这样并没有解决方案。
证下:n为奇数,m为偶数。如果k=-1,那么每行每列就有奇数个-1那么对于行来说 就有(奇数*奇数)个-1.对于列来说就有(奇数*偶数)个-1这显然不相等,就无解。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,k;
const int mod=1e9+7;
ll qpow(ll a,ll b){
ll sum=1;
while(b){
if(b&1) sum=sum*a%mod;
a=a*a%mod;
b>>=1;
}
return sum;
}
int main(){
cin>>n>>m>>k;
if((n+m)&1&&k==-1) puts("0");
else {
cout<<qpow(qpow(2,n-1),m-1)%mod<<endl;
}
return 0;
}