思维题-方案数

题目连接

题意:

在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;
}

posted @ 2017-11-27 22:28  Linese  阅读(155)  评论(0编辑  收藏  举报