比赛 |
exam |
评测结果 |
AAAAAAAAAA |
题目名称 |
棋盘放車 |
最终得分 |
100 |
用户昵称 |
TARDIS |
运行时间 |
0.092 s |
代码语言 |
C++ |
内存使用 |
32.29 MiB |
提交时间 |
2017-07-03 19:43:40 |
显示代码纯文本
#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;
}