记录编号 |
240946 |
评测结果 |
AAAAAAAAAA |
题目名称 |
雕塑安置 |
最终得分 |
100 |
用户昵称 |
ZXCVBNM_1 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.017 s |
提交时间 |
2016-03-24 09:37:17 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL tot,n,r[36];
bool vis[36][36],h[36],l[36];
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<=min(m,n);i++)
{
if(i%2==0)ans+=r[i]*k;
else ans-=r[i]*k;
if(nn==0)break;
k/=nn;nn--;
//if(nn==0)break;
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return 0;
}