比赛 20160323 评测结果 ATAAAATTTT
题目名称 雕塑安置 最终得分 50
用户昵称 WAHT 运行时间 5.004 s
代码语言 C++ 内存使用 0.29 MiB
提交时间 2016-03-23 19:57:34
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int ditu[30][30],mark[30];
int n,m,limit;
ll ans=0;
int Log(int value)
{
	if(value==1)		return 0;
	else	return 1+Log(value>>1);
}
void dfs(int row,int ld)
{
	if(row==n)	ans++;
	else
	{
		int pos=limit&(~ld);
		while(pos)
		{
			int p=pos&-pos;
			pos-=p;
			if(ditu[row][Log(p)])
				continue;
			dfs(row+1,ld+p);
		}
	}
}
int main()
{
	freopen("arrange.in","r",stdin);
	freopen("arrange.out","w",stdout);
	scanf("%d%d",&n,&m);
	limit=(1<<n)-1;
	for(int i=1;i<=m;i++)
	{	
		int a,b;
		cin>>a>>b;
		ditu[a-1][b-1]=1;
	}
	dfs(0,0);
	printf("%lld\n",ans);
	return 0;
}