zoukankan      html  css  js  c++  java
  • matrix

    不能不计算重复情况,用容斥原理

    避免了二维容斥

    部分分:

        m=1   ans=1;

        m=2   ans=3^n-2;    每一行有三种情况,第一个是黑,第二个是黑,两个全是黑,减去一行全是白一行全是黑的两种情况...

        n,m<=5 搜索;

        n,m<=6 打表;

    #include<iostream>
    #include<cstdio>
    using namespace std;
    typedef long long ll;
    const ll mod=1e9+7;
    const ll maxn=1e5+7;
    ll n,m;
    ll fac[200005],ifac[200005];
    ll qpow(ll a,ll b,ll p){
        ll ans=1;
        for(;b;b>>=1,a=(a*a)%p){
            if(b&1) {ans*=a;ans%=mod;} 
        }
        return ans;
    }
    void get(){
        fac[0]=1;
        for(int i=1;i<=200000;i++){
            fac[i]=(fac[i-1]*i)%mod;
        }
        ifac[200000]=qpow(fac[200000],mod-2,mod);
        for(int i=200000;i>=1;i--){
            ifac[i-1]=(ifac[i]*i)%mod;
        }//计算逆元
    }
    ll C(int m,int n){
        return fac[n]*ifac[m]%mod*ifac[n-m]%mod;
    }
    int main(){
        cin>>n>>m;get();
        ll ans=0;
        for(ll k=0;k<=n;k++){
            ll c=fac[n]*ifac[k]%mod*ifac[n-k]%mod;
            ll p=(qpow(2,n-k,mod)%mod-1+mod)%mod;
            if(k%2==1){
                ans=(ans-c*qpow(p,m,mod)+mod)%mod;ans%=mod;
            }
            if(k%2==0){
                ans=ans+c*qpow(p,m,mod)%mod;ans%=mod;ans%=mod;
            }
            ans%=mod;
        }
        cout<<ans<<endl;
        return 0; 
    } 

    要注意的是,不要用if(!i&1)

  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/lcan/p/9538384.html
Copyright © 2011-2022 走看看