记录编号 575175 评测结果 AAAAAAAAAA
题目名称 GodFly的寻宝之旅 最终得分 100
用户昵称 Gravatar00000 是否通过 通过
代码语言 C++ 运行时间 2.158 s
提交时间 2022-09-07 16:23:45 内存使用 105.22 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=19260817;
ll n,k;
ll g[30][30];
ll c;
ll f[300000][20][2];//路径,位置,0/1 
ll h=0;
//存储路径防止重复 
ll sum;
int main(){
	freopen("GodFly.in","r",stdin);
	freopen("GodFly.out","w",stdout);
cin>>n>>k;
for(int q=1;q<=k;q++)
{
	ll x,y;
	cin>>x>>y;
	g[x][y]++,g[y][x]++;
}
cin>>c;
memset(f,0,sizeof(f));
f[0][1][0]=1;
for(int q=1;q<(1<<n);q++)//路径 
{
	sum=0;
	for(int w=1;w<=n;w++)
	{
		if( ( q&(1<<(w-1)) ) ) sum+=w;
	}
	sum%=2;
	for(int i=1;i<=n;i++)//当前位置 (不能在路径中)
	{
		if(  (1<<(i-1))&q  ) continue;//是不等于0,不是等于1 
			for(int w=1;w<=n;w++)//上一个点 
		{			
			if( ( (1<<(w-1))&q ) ==0) continue;
			//确定已在路径中  
			for(int e=0; e<=1;e++)//两个状态 
			{
				ll x=i*sum%2;
				f[q][i][e]=(f[q][i][e]+f[ q^(1<<(w-1)) ][ w ][e^x]*g[i][w])%p; 
			}
			
		}
		
		
	}
}
ll ans=0;
for(int q=1;q<(1<<n);q++)
{
	ans=(ans+f[q][n][c])%p;
//	cout<<f[q][n][c]<<endl;
}
cout<<ans;
return 0;
}