萌新求助状压dp
查看原帖
萌新求助状压dp
674247
seanlsy楼主2022/8/29 23:00

rt,全 WA

#include <bits/stdc++.h>
using namespace std;
#define mod 19260817
inline int read(){
	int x=0;bool f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f?x:-x;
}
int n,m,u,v,vis[20][20],f[20][(1<<18)+5][2],c,s[(1<<18)+5],ans;
inline int sum(int x){
	if(~s[x]) return s[x];
	for(int i=0;(1<<i)<=x;i++)
		if((1<<i)&x)
			s[x]+=i+1;
	return s[x]=s[x]&1;
}
int main(){
	n=read(),m=read();
	for(int i=0;i<(1<<n);i++)
		s[i]=-1;
	while(m--)
		u=read(),v=read(),vis[u][v]++,vis[v][u]++;
	c=read();
	f[1][1][0]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<(1<<n);j++)
			if(j&(1<<i-1))
				for(int k=1;k<=n;k++)
					if((i^k)&&(!(j&(1<<k-1))))
						f[k][j|(1<<k-1)][k*sum(j)&1]=1ll*(f[k][j|(1<<k-1)][k*sum(j)&1]+f[i][j][0]*vis[i][k])%mod,
						f[k][j|(1<<k-1)][(k*sum(j)&1)^1]=1ll*(f[k][j|(1<<k-1)][(k*sum(j)&1)^1]+f[i][j][1]*vis[i][k])%mod;
	for(int i=1;i<(1<<n);i+=2)
		if((1<<n-1)&i)
			(ans+=f[n][i][c])%=mod;
	printf("%d\n",ans);
	return 0;
}
2022/8/29 23:00
加载中...