比赛 |
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;
- }