比赛 |
exam |
评测结果 |
AAAAAAAAAA |
题目名称 |
棋盘放車 |
最终得分 |
100 |
用户昵称 |
liuyu |
运行时间 |
0.158 s |
代码语言 |
C++ |
内存使用 |
30.83 MiB |
提交时间 |
2017-07-03 19:36:22 |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,s[2000000],cnt[2000000],unon[23];
ll temp;
void _init()
{
scanf("%lld%lld",&n,&m);
ll a,b;
temp=(1<<n)-1;
for(ll i=1;i<=m;i++)
{
scanf("%lld%lld",&a,&b);
unon[a]|=(1<<(n-b));
}
for(ll i=1;i<=temp;i++)
{
cnt[i]=cnt[i>>1]+(i&1);
}
}
ll lowbit(int x){return x&(-x);
}
int main()
{
freopen("examone.in","r",stdin);
freopen("examone.out","w",stdout);
_init();
s[0]=1;
for(ll i=1;i<=temp;i++)
for(ll j=i;j;j-=lowbit(j))
{
ll k=lowbit(j);
if(k&unon[cnt[i]])continue;
s[i]+=s[i-k];
}
printf("%lld",s[temp]);
return 0;
}