zoukankan      html  css  js  c++  java
  • THUPC2021 网络赛题解

    #include<bits/stdc++.h>
    #define N 13
    #define M 4100
    #define db double
    #define ll long long
    #define ldb long double
    #define ull unsigned long long
    using namespace std;
    const int h=3,ki=149,mo=998244353;
    inline int mod(int x){return (x%mo+mo)%mo;}
    inline int inc(int x,int k){x+=k;return x<mo?x:x-mo;}
    inline int dec(int x,int k){x-=k;return x>=0?x:x+mo;}
    int read()
    {
    	char ch=0;int x=0,flag=1;
    	while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
    	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0',ch=getchar();}
    	return x*flag;
    }
    void write(int x)
    {
    	if(!x)return (void)putchar(48);
    	if(x<0)putchar(45),x=-x;
    	int len=0,p[20];
    	while(x)p[++len]=x%10,x/=10;
    	for(int i=len;i>=1;i--)putchar(p[i]+48);
    }
    int len[M],mp[M][M];
    int S[N][N],f[M][N],g[M][N],a[M][M],b[M][M],dp[N][M][M];
    int main()
    {
    	int n=read(),k=read();
    	
    	/*
    	for(int i=1;i<=n*(n-1);i++)
    	{
    		int x=read(),y=read(),p=read(),q=read();
    		S[x][y]=1ll*p*inv(q)%mo;
    	}
    	*/
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	if(i!=j)S[i][j]=rand();
    	
    	
    	for(int s=1;s<(1<<n);s++)
    	for(int x=1;x<=n;x++)	
    	if(!((1<<(x-1))&s))
    	{
    		int tmp=1;
    		for(int i=1;i<=n;i++)
    		{
    			if(i==x)continue;
    			if((1<<(i-1))&s)tmp=1ll*tmp*dec(1,S[i][x])%mo;
    		}
    		f[s][x]=dec(1,tmp);g[s][x]=tmp;
    	}
    	
    	//a[s][t]表示s向t连
    	//b[s][t]表示s向t全部不连
    	for(int s=1;s<(1<<n);s++)
    	{
    		int k=((1<<n)-1)-s;
    		for(int t=k;t;t=(t-1)&k)
    		if((s&t)==0)
    		{
    			a[s][t]=b[s][t]=1;
    			for(int i=1;i<=n;i++)if((1<<(i-1))&(t))
    			{
    				a[s][t]=1ll*a[s][t]*f[s][i]%mo;
    				b[s][t]=1ll*b[s][t]*g[s][i]%mo;
    			}
    		}
    	}
    	
    	
    	for(int t=1;t<(1<<n);t++)a[0][t]=b[0][t]=1;
    	
    	int v=(1<<n)-1,ans=0; 
    	dp[0][1][1]=1;
    	
    	
    	for(int s=0;s<(1<<n);s++)for(int t=s;t;t=(t-1)&s)mp[s][++len[s]]=t;
    	
    	
    	for(int i=0;i<k;i++)
    	{
    		for(int s=0;s<(1<<n);s++)
    		for(int j=1;j<=len[s];j++)
    		for(int t=1;t<=len[v^s];t++)
    		{
    			int &go=dp[i+1][s|mp[v^s][t]][mp[v^s][t]];
    			go+=1ll*dp[i][s][mp[s][j]]*a[mp[s][j]][mp[v^s][t]]%mo*b[s^mp[s][j]][mp[v^s][t]]%mo; 
    			if(go>=mo)go-=mo;
    		} 
    		for(int s=0;s<(1<<n);s++)ans=inc(ans,dp[i+1][v][s]);
    	}
    	write(ans);
    	return 0;
    }
    
  • 相关阅读:
    caffe杂
    easyui 扩展layout的方法,支持动态添加删除块
    easyui换主题,并记录在cookie
    $.messager.show扩展:指定位置显示
    easyui 扩展 之 Tree的simpleData加载
    easyui menu 添加hideItem/showItem 方法
    HTML标签及属性大全
    适应各种内核浏览器的透明修过样式
    让IE6支持min-width和max-width的方法
    javascript获取html标记的的绝对定位值
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/14156705.html
Copyright © 2011-2022 走看看