zoukankan      html  css  js  c++  java
  • UOJ #37【清华集训2014】主旋律

    Description

    响应主旋律的号召,大家决定让这个班级充满爱,现在班级里面有 $n$ 个男生。

    如果 $a$ 爱着 $b$,那么就相当于 $a$ 和 $b$ 之间有一条 $a ightarrow b$ 的有向边。如果这 $n$ 个点的图是强联通的,那么就认为这个班级是充满爱的。

    不幸的是,有一些不好的事情发生了,现在每一条边都可能被摧毁。我作为爱的使者,想知道有多少种摧毁的方式,使得这个班级任然充满爱呢?(说人话就是有多少边的子集删去之后整个图仍然强联通。)

    Solution

    设$dp_i$为点集$i$有多少边的子集保留时整个图强联通,即为答案

    整张图缩点之后形成一张DAG,所以考虑有向图DAG计数:

    $$f_S=sum_{T subset S ,T e emptyset} (-1)^{|T|-1} f_{S-T} 2^{edge(T,S-T)}$$

    发现容斥系数值只与点的个数的奇偶性有关

    那么设$D_i$为点集$i$被分为奇数个强联通分量的方案数,$C_i$为点集$i$被分为偶数个强联通分量的方案数,$dag_i$为点集$i$形成DAG的方案数,最终用全集减去它就是$dp$

    $$dag_S = sum_{T subset S}(D_T-C_T) 2^{edge(T,S-T)+edge{S-T,S-T}}$$

    $$D_S=sum_{T subset S}dp_T C_{S-T}$$

    $$C_S=sum_{T subset S}dp_T D_{S-T}$$

    #include<iostream>
    #include<cstdio>
    #include<bitset>
    using namespace std;
    int n,m,p[305]={1};
    long long D[40005],S[40005]={1},dp[40005];
    const long long mod=1e9+7;
    bitset<230>out[40005],in[40005];
    inline int read(){
        int w=0,f=1;
        char ch=0;
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
        while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=getchar();
        return w*f;
    }
    int main(){
        n=read(),m=read();
        for(int i=1;i<=n*n;i++)p[i]=p[i-1]*2%mod;
        for(int i=1;i<=m;i++){
            int u=read(),v=read();
            for(int j=1;j<(1<<n);j++){
                if((j>>(u-1))&1)out[j][i]=1;
                if((j>>(v-1))&1)in[j][i]=1;
            }
        }
        for(int i=1;i<(1<<n);i++){
            dp[i]=p[(in[i]&out[i]).count()];
            for(int s=(i-1)&i;s;s=(s-1)&i){
                ((dp[i]-=((D[s]-S[s])*p[(out[s]&in[i-s]).count()+(out[i-s]&in[i-s]).count()]%mod+mod)%mod)+=mod)%=mod;
                if(s&(i&-i))(D[i]+=dp[s]*S[i-s]%mod)%=mod,(S[i]+=dp[s]*D[i-s]%mod)%=mod;
            }
            (((dp[i]-=(D[i]-S[i])%mod+mod)%=mod)+=mod)%=mod,(D[i]+=dp[i])%=mod;
        }
        printf("%lld
    ",dp[(1<<n)-1]);
        return 0;
    }
    【清华集训2014】主旋律
  • 相关阅读:
    uva 10491 Cows and Cars
    uva 10910 Marks Distribution
    uva 11029 Leading and Trailing
    手算整数的平方根
    uva 10375 Choose and divide
    uva 10056 What is the Probability?
    uva 11027 Palindromic Permutation
    uva 10023 Square root
    Ural(Timus) 1081. Binary Lexicographic Sequence
    扩展欧几里得(求解线性方程)
  • 原文地址:https://www.cnblogs.com/JDFZ-ZZ/p/14269652.html
Copyright © 2011-2022 走看看