思维题-方案数
题意:
在n*m的方格中填入数字使得每行每列的的乘积都等于k值,k等于1或者-,问有多少种方案
1<=n,m<=1e18;
最终答案要取模1e9+7;
题解:
k1||k-1说明方格中只能填1或者-1,
这样每一行每一列的最后一格可以来决定最终答案,
因此(n-1)*(m-1)个格子可以随意填
所以总方案数为2^((n-1)*(m-1))
当n和m的奇偶性不同时且k==-1则无解,输出零
用到算法:快速幂取模
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
int gcd(int a,int b) {return b==0 ? a:gcd(b,a%b);}//gcd简写
ll qpow(ll a,ll b){ll ret=1;for(;b;b>>=1,a=a*a%mod) if(b&1) ret=ret*a%mod;return ret;}//快速幂简写
int main()
{
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
if((n%2!=m%2)&&k==-1) printf("0\n");
else{
printf("%lld\n",qpow(qpow(2,n-1),m-1));
}
return 0;
}