제출 #697268

#제출 시각아이디문제언어결과실행 시간메모리
697268vjudge1Amusement Park (CEOI19_amusementpark)C++17
100 / 100
1635 ms6476 KiB
#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &x)
{
	x=0;T f=1;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-')f=-1;
	for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x*=f;
}
template <typename T,typename ...Args>void read(T &x,Args&...args){read(x),read(args...);}
template <typename T> void print(T x)
{
	if(x<0) x=-x,putchar('-'); 
	if(x>9) print(x/10);
	putchar(x%10+48);
}
template <typename T> void print(T x,char c){print(x); putchar(c);}
template<typename T>inline void output(T x){print(x,' ');}
template<typename T,typename ...Arg>inline void output(T x,Arg ...arg){output(x);output(arg...);}
const int N=20,M=1<<20,mod=998244353;
struct Mint
{
	int x;
	Mint(int y=0){x=(y%mod+mod)%mod;}
	Mint &operator = (int y){return x=(y%mod+mod)%mod,*this;}
	Mint &operator = (long long y){return x=(y%mod+mod)%mod,*this;}
	Mint &operator +=(Mint y){return x=x+y.x>=mod?x+y.x-mod:x+y.x,*this;}
	Mint &operator -=(Mint y){return x=x-y.x<0?x-y.x+mod:x-y.x,*this;}
	Mint &operator *=(Mint y){return x=1ll*x*y.x%mod,*this;}
	Mint &operator ^=(int y)
	{
		Mint a=*this,c=1;
		for(;y;y>>=1,a*=a)
			if(y&1) c*=a;
		return x=c.x,*this;
	}
	Mint &operator /=(Mint y){return *this*=y^=mod-2;}
	Mint &operator +=(int y){return x=x+y>=mod?x+y-mod:x+y,*this;}
	Mint &operator -=(int y){return x=x-y<0?x-y+mod:x-y,*this;}
	Mint &operator *=(int y){return x=1ll*x*y%mod,*this;}
	Mint &operator /=(int y){return *this *= ((Mint(y))^=mod-2);}
	Mint &operator +=(long long y){return x=x+y>=mod?x+y-mod:x+y,*this;}
	Mint &operator -=(long long y){return x=x-y<0?x-y+mod:x-y,*this;}
	Mint &operator *=(long long y){return x=1ll*x*y%mod,*this;}
	Mint &operator /=(long long y){return *this *= ((Mint(y))^=mod-2);}
	template<class T>friend Mint operator +(Mint a,T b){return a+=b;}
	template<class T>friend Mint operator -(Mint a,T b){return a-=b;}
	template<class T>friend Mint operator *(Mint a,T b){return a*=b;}
	template<class T>friend Mint operator /(Mint a,T b){return a/=b;}
	friend Mint operator ^(Mint a,int b){return a^=b;}
	friend bool operator ==(Mint a,int b){return a.x==b;}
	friend bool operator !=(Mint a,int b){return a.x!=b;}
	friend Mint operator ^(Mint a,long long b){return a^=b;}
	friend bool operator ==(Mint a,long long b){return a.x==b;}
	friend bool operator !=(Mint a,long long b){return a.x!=b;}
	bool operator ! (){return !x;}
	Mint operator - (){return x?mod-x:0;}
	bool operator <(const Mint&b)const{return x<b.x;}
};
int n,m,k,x[N*N],y[N*N],cnt[M],can[M];
Mint dp[M];
int main()
{
	read(n,m); k=1<<n;
	for(int i=1;i<=m;i++) read(x[i],y[i]);
	for(int i=0;i<k;i++)
	{
		int sum=0;
		for(int j=i;j;j&=(j-1)) sum++;
		if(sum&1) cnt[i]=1;
		else cnt[i]=mod-1;
		for(int j=1;j<=m;j++)
			if((i&(1<<(x[j]-1)))&&(i&(1<<(y[j]-1))))
			{can[i]=1;break;}
	}
	dp[0]=1;
	for(int i=1;i<k;i++)
		for(int j=i;j;j=i&(j-1))
			if(!can[j]) dp[i]+=dp[i^j]*cnt[j];
	print((dp[k-1]*m/2).x,'\n');
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...