zoukankan      html  css  js  c++  java
  • P4336 [SHOI2016]黑暗前的幻想乡

    题目

    P4336 [SHOI2016]黑暗前的幻想乡

    做法

    每种颜色恰好一条边,有点难处理啊

    根据套路,数据范围这么小,容斥一下所有的情况就可以了

    对每种颜色进行状压,表这次只能选这些颜色,做(n-1)的时候会加上多余的东西,就减去(n-2......)

    剩下的交给矩阵树,这题有模数,高斯消元的时候逆元

    My complete code

    #include<cstring>
    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    typedef long long LL;
    const LL maxn=19;
    const LL p=1e9+7;
    inline LL Read(){
    	LL x(0),f(1); char c=getchar();
    	while(c<'0'||c>'9'){
    		if(c=='-')f=-1; c=getchar();
    	}
    	while(c>='0'&&c<='9')
    	    x=(x<<3)+(x<<1)+c-'0',c=getchar();
    	return x*f;
    }
    LL n,ans;
    LL m[maxn],size[1<<maxn];
    LL D[maxn][maxn],eu[maxn][maxn*maxn],ev[maxn][maxn*maxn];
    inline LL Pow(LL base,LL b){
    	LL ret(1);
    	while(b){
    		if(b&1)
    		    ret=(ret*base)%p;
    		base=base*base%p;
    		b>>=1;
    	}
    	return ret;
    }
    inline LL Solve(){
    	LL N=n-1,tr=0;
    	for(LL i=1;i<=N;++i){
    		LL mx=i;
    		for(LL j=i+1;j<=N;++j)
    		    if(D[mx][i]<D[j][i])
    		        mx=j;
    		if(D[mx][i]==0)
    		    return 0;
    		if(mx!=i){
    			tr^=1;
    			swap(D[mx],D[i]);
    		}
    		for(LL j=i+1;j<=N;++j){
    			LL tmp=D[j][i]*Pow(D[i][i],p-2)%p;
    			for(LL k=i;k<=N;++k)
    			    D[j][k]=(D[j][k]-tmp*D[i][k]%p+p)%p;
    		}
    	}
    	LL ret(1);
    	for(LL i=1;i<=N;++i)
    	    ret=(ret*D[i][i])%p;
    	if(tr)
    	    ret=p-ret;
    	return ret;
    }
    int main(){
    	n=Read();
    	for(LL i=1;i<n;++i){
    		m[i]=Read();
    		for(LL j=1;j<=m[i];++j)
    		    eu[i][j]=Read(),ev[i][j]=Read();
    	}
    	LL Up=1<<(n-1);
    	for(LL i=1;i<Up;++i)
    	    size[i]=size[i>>1]+(i&1);
    	for(LL i=1;i<Up;++i){
    		memset(D,0,sizeof(D));
    		for(LL j=1,bit=i;bit;bit>>=1,++j){
    			if((bit&1)==0)
    			    continue;
    			for(LL k=1;k<=m[j];++k){
    				LL u(eu[j][k]),v(ev[j][k]);
    				++D[u][u],++D[v][v],
    				D[u][v]=(D[u][v]+p-1)%p,D[v][u]=(D[v][u]+p-1)%p;
    			}
    		}
    		ans=(ans+(( ((n-1-size[i])&1)==0)?Solve():-Solve())+p)%p;
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    在web大作业中曾经遇到的程序测试案例…
    软件测试技术 hw3
    软件测试技术 hw2
    软件测试技术 上机实验1
    软件项目管理 hw1
    软件测试技术 hw1
    软件测试技术-第七题
    软件测试技术 上机实验1
    软件测试技术 homework2
    软件项目管理 homework1 曾经做过的project
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10265056.html
Copyright © 2011-2022 走看看