比赛 20160323 评测结果 WAEAAAAAAA
题目名称 雕塑安置 最终得分 80
用户昵称 ZXCVBNM_1 运行时间 0.159 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2016-03-23 20:46:16
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. LL tot,n,r[16];
  5. bool vis[26][26],h[26],l[26];
  6. void dfs(int x,int y,int gs)
  7. {
  8. //bool hh,ll;
  9. if(y==n+1){x++;y=1;}
  10. if(x==n+1)
  11. {
  12. if(gs==0)tot++;
  13. return;
  14. }
  15. dfs(x,y+1,gs);
  16. 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;}
  17. }
  18. int main()
  19. {
  20. freopen("arrange.in","r",stdin);
  21. freopen("arrange.out","w",stdout);
  22. LL m,k,i,x,y,ans,nn;
  23. scanf("%lld %lld",&n,&m);
  24. memset(vis,false,sizeof(vis));
  25. for(i=1;i<=m;i++){scanf("%lld %lld",&x,&y);vis[x][y]=true;}
  26. memset(h,false,sizeof(h));
  27. memset(l,false,sizeof(l));
  28. r[0]=1;
  29. for(i=1;i<=m;i++)
  30. {
  31. tot=0;
  32. dfs(1,1,i);
  33. r[i]=tot;
  34. }
  35. k=1;nn=n;
  36. for(i=1;i<=n;i++)k*=i;
  37. ans=0;
  38. for(i=0;i<=m;i++)
  39. {
  40. if(i%2==0)ans+=r[i]*k;
  41. else ans-=r[i]*k;
  42. k/=nn;nn--;
  43. if(nn==0)break;
  44. }
  45. printf("%lld",ans);
  46. fclose(stdin);
  47. fclose(stdout);
  48. return 0;
  49. }