zoukankan      html  css  js  c++  java
  • 思维题-方案数

    题目连接

    题意:

    在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
    ");
        else{
            printf("%lld
    ",qpow(qpow(2,n-1),m-1));
        }
        return 0;
    }
    
    
  • 相关阅读:
    leetcode74
    leetcode59
    leetcode1283
    0079. Word Search (M)
    0067. Add Binary (E)
    0203. Remove Linked List Elements (E)
    用async 解放你的大脑
    Python 类属性和方法
    Python 类装饰器
    Python 装饰器
  • 原文地址:https://www.cnblogs.com/q1076452761/p/7906499.html
Copyright © 2011-2022 走看看