比赛 动规 评测结果 AAAAAAAAAA
题目名称 棋盘放車 最终得分 100
用户昵称 TARDIS 运行时间 0.100 s
代码语言 C++ 内存使用 32.29 MiB
提交时间 2017-06-18 21:31:39
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cctype>
#define COGS
using namespace std;
const int maxn=21;
typedef long long LL;
LL f[1<<maxn],n,m,num,s[maxn],cnt[1<<maxn],temp,t;
void init(int n){
	num=(1<<n)-1;
	for (int i=1;i<=n;i++){
		s[i]=num;
	}
}
int lowbit(int x){
	return x&-x;
}
int getbit(int x){
	int num=0;
	while (x){
		num++;
		x-=lowbit(x);
	}
	return num;
}
void in(){
	#ifdef COGS
	freopen("examone.in","r",stdin);
	freopen("examone.out","w",stdout);
	#endif
	scanf("%lld%lld",&n,&m);init(n);
	for (int i=1;i<=m;i++){
		scanf("%lld%lld",&temp,&t);
		s[temp]-=1<<(t-1);
	}
}
void deal(){
	f[0]=1;
	for (LL i=1;i<=num;i++){
		int g=i&(s[getbit(i)]);
		while (g){
			f[i]+=f[i^lowbit(g)];
			g-=lowbit(g);
		}
	}
}
void put(){
	printf("%lld",f[num]);
}
int main(){
	in();
	deal();
	put();
	return 0;
}