比赛 |
20160323 |
评测结果 |
AAAAAAAAAA |
题目名称 |
雕塑安置 |
最终得分 |
100 |
用户昵称 |
前鬼后鬼的守护 |
运行时间 |
1.106 s |
代码语言 |
C++ |
内存使用 |
24.35 MiB |
提交时间 |
2016-03-23 19:28:42 |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<iostream>
#include<algorithm>
#define FILE "arrange"
typedef long long ll;
namespace IO{
char buf[1<<15],*fs,*ft;
inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,rev=0,ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getc();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getc();}
return rev?-x:x;
}
}using namespace IO;
const int MAXN(20),D(10);
//namespace Queue{
struct queue{
int num[1<<MAXN],fro,rear;
inline void clear(){fro=0,rear=-1;}
inline void push(int x){num[++rear]=x;}
inline int pop(){return num[fro++];}
inline bool empty(){return fro>rear;}
}q[2];
//}using namespace Queue;
int n;
bool able[MAXN+D][MAXN+D];
ll f[2][1<<MAXN];
void init(){
n=read();
memset(able,1,sizeof able);
int m=read();
while(m--){
int x=read(),y=read()-1;
able[x][y]=false;
}
}
void work(){
f[0][0]=1;
q[0].clear();q[0].push(0);
for(int i=1;i<=n;i++){
int now=i&1,prev=now^1;
q[now].clear();
memset(f[now],0,sizeof f[now]);
while(!q[prev].empty()){
int S=q[prev].pop();
ll cnt=f[prev][S];
for(int j=0;j<n;j++)
if(((S>>j)&1)==0&&able[i][j]){
int nS=S|(1<<j);
if(!f[now][nS])q[now].push(nS);
f[now][nS]+=cnt;
}
}
}
printf("%lld\n",f[n&1][(1<<n)-1]);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
init();
work();
return 0;
}