codeforces 894B

题目大意:给定一个m*n的方格,在其中放入1或者-1 使得每行每列的乘积都为K 问有多少种放法

思路:解法其实只有一句话,但是我想说的是,我真的想了很久没有想到这个角度,之前的时候Trader说想复杂了,其实很简单,但我觉得并不是的,并不是想复杂了的问题,而是角度的切入有问题,我之前一直想不出来是因为我一直在想怎么样能够找到一个公式来表示某一种合理排列的情况,而事实是,我不需要知道怎么一步一步得到一个合理排列,里面的任意一种排列我可以找到一种方法来控制其乘积就好了。
这个题我们对于一个图来说前M-1列和N-1行可以任意排,只要留下一行一列来控制他的最后的乘积就可以了,所以最后的结果是 2[(n1)(m1)]
然后有一个特例要判断一下,就是k =-1时,nm同奇偶

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const long long inf =1e18;
const int maxn = 1e5+50;
const int mod =1e9+7;
ll T,n,m;
ll qpow(ll a, ll b)
{
    ll res=1,base=a;
    while(b)
    {
        if(b&1)res=(res*base)%mod;
        base=(base*base)%mod;
        b=b>>1;
    }
    return res;
}
int k;
void solve()
{
    if(k==-1)
    {
        if((n%2)!=(m%2))
        {
            printf("0\n");
            return ;
        }
    }
    ll p1=qpow(2,n-1);
    ll p2=qpow(p1,m-1);
    printf("%I64d\n",p2);
}
int main()
{
    scanf("%I64d%I64d%d",&n,&m,&k);
    solve();
    return 0;
}

你可能感兴趣的:(数论,水题,小技巧)