记录编号 |
575175 |
评测结果 |
AAAAAAAAAA |
题目名称 |
GodFly的寻宝之旅 |
最终得分 |
100 |
用户昵称 |
00000 |
是否通过 |
通过 |
代码语言 |
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;
}