比赛 |
20160323 |
评测结果 |
WAEAAAAAAA |
题目名称 |
雕塑安置 |
最终得分 |
80 |
用户昵称 |
ZXCVBNM_1 |
运行时间 |
0.159 s |
代码语言 |
C++ |
内存使用 |
0.31 MiB |
提交时间 |
2016-03-23 20:46:16 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL tot,n,r[16];
bool vis[26][26],h[26],l[26];
void dfs(int x,int y,int gs)
{
//bool hh,ll;
if(y==n+1){x++;y=1;}
if(x==n+1)
{
if(gs==0)tot++;
return;
}
dfs(x,y+1,gs);
if(vis[x][y]==true&&h[x]==false&&l[y]==false){h[x]=true;l[y]=true;dfs(x,y+1,gs-1);h[x]=false;l[y]=false;}
}
int main()
{
freopen("arrange.in","r",stdin);
freopen("arrange.out","w",stdout);
LL m,k,i,x,y,ans,nn;
scanf("%lld %lld",&n,&m);
memset(vis,false,sizeof(vis));
for(i=1;i<=m;i++){scanf("%lld %lld",&x,&y);vis[x][y]=true;}
memset(h,false,sizeof(h));
memset(l,false,sizeof(l));
r[0]=1;
for(i=1;i<=m;i++)
{
tot=0;
dfs(1,1,i);
r[i]=tot;
}
k=1;nn=n;
for(i=1;i<=n;i++)k*=i;
ans=0;
for(i=0;i<=m;i++)
{
if(i%2==0)ans+=r[i]*k;
else ans-=r[i]*k;
k/=nn;nn--;
if(nn==0)break;
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return 0;
}