Description

给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在
这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行只有一枚棋子,每列只有一枚棋子
的限制,求有多少种方案。
 

Input

第一行一个N,接下来一个N*N的矩阵。N<=200,0表示没有障碍,1表示有障碍,输入格式参考样例
 

Output

一个整数,即合法的方案数。

Sample Input

2
0 1
1 0

Sample Output

1
 
我终于TM写对高精度了!!!
NOIP2014D2T3高精度写炸、2014海淀区赛高精度写炸、CCC2016高精度写炸、BJTSC2016二试高精度写炸。
总结起来是8个字:cnbb、mdzz。
考虑使用容斥原理,ans=g0-g1+g2-g3+----。其中gi表示至少有i个棋子放错的答案,则gi=C(k,i)*(n-i)!,k表示总障碍个数。
然后写高精度就行了。
  1. #include<cstdio>
  2. #include<cctype>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define ren for(int i=first[x];i;i=next[i])
  9. using namespace std;
  10. const int BufferSize=1<<16;
  11. char buffer[BufferSize],*head,*tail;
  12. inline char Getchar() {
  13. if(head==tail) {
  14. int l=fread(buffer,1,BufferSize,stdin);
  15. tail=(head=buffer)+l;
  16. }
  17. return *head++;
  18. }
  19. inline int read() {
  20. int x=0,f=1;char c=getchar();
  21. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  22. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  23. return x*f;
  24. }
  25. typedef long long ll;
  26. const int maxn=410;
  27. struct bign {
  28. int len,s[maxn];
  29. bign() {memset(s,0,sizeof(s));len=1;}
  30. void operator = (int b) {
  31. len=0;while(b) s[len++]=b%10,b/=10;
  32. }
  33. void clean() {while(len>1&&!s[len-1]) len--;}
  34. bign operator + (const bign& b) const {
  35. bign c;c.len=max(b.len,len)+1;
  36. rep(i,0,c.len-1) {
  37. c.s[i]+=s[i]+b.s[i];
  38. c.s[i+1]+=c.s[i]/10;
  39. c.s[i]%=10;
  40. }
  41. c.clean();return c;
  42. }
  43. bign operator - (const bign& b) const {
  44. bign c;c.len=max(b.len,len);
  45. rep(i,0,c.len-1) {
  46. c.s[i]+=s[i]-b.s[i];
  47. if(c.s[i]<0) c.s[i]+=10,c.s[i+1]--;
  48. }
  49. c.clean();return c;
  50. }
  51. bign operator * (const int b) const {
  52. bign c;c.len=len+5;
  53. int last=0;
  54. rep(i,0,c.len-1) {
  55. c.s[i]=s[i]*b+last;
  56. last=c.s[i]/10;
  57. c.s[i]%=10;
  58. }
  59. c.clean();return c;
  60. }
  61. bign operator * (const bign& b) const {
  62. bign c;c.len=len+b.len+2;
  63. rep(i,0,len-1) rep(j,0,b.len-1) c.s[i+j]+=s[i]*b.s[j];
  64. rep(i,0,c.len-1) c.s[i+1]+=c.s[i]/10,c.s[i]%=10;
  65. c.clean();return c;
  66. }
  67. void print() {dwn(i,len-1,0) printf("%d",s[i]);puts("");}
  68. };
  69. bign C[2][maxn],xp[maxn];
  70. int main() {
  71. int n=read(),k=0;
  72. rep(i,1,n) rep(j,1,n) k+=read();
  73. xp[0]=1;rep(i,1,n) xp[i]=xp[i-1]*i;
  74. int cur=0;
  75. rep(i,1,k) {
  76. cur^=1;
  77. C[cur][0]=1;C[cur][i]=1;
  78. rep(j,1,i-1) C[cur][j]=C[cur^1][j-1]+C[cur^1][j];
  79. }
  80. bign ans=xp[n];
  81. rep(i,1,k) {
  82. bign res=C[cur][i]*xp[n-i];
  83. if(i&1) ans=ans-res;
  84. else ans=ans+res;
  85. }
  86. ans.print();
  87. return 0;
  88. }

  

BZOJ4563: [Haoi2016]放棋子的更多相关文章

  1. bzoj4563: [Haoi2016]放棋子(错排+高精)

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 387  Solved: 247[Submit][Status] ...

  2. BZOJ4563 HAOI2016放棋子(高精度)

    没看清题还以为是要求数最大匹配数量……注意到任意障碍不在同一行同一列,且恰好有n个障碍,不妨通过交换列使得第i行第i列均有障碍.那么就是个错排了.居然wa了一发简直没救. #include<io ...

  3. 【BZOJ4563】[Haoi2016]放棋子 错排+高精度

    [BZOJ4563][Haoi2016]放棋子 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...

  4. 洛谷P3182 [HAOI2016]放棋子

    P3182 [HAOI2016]放棋子 题目描述 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要 ...

  5. [Haoi2016]放棋子 题解

    4563: [Haoi2016]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 285[Submit][Status] ...

  6. BZOJ4563:[HAOI2016]放棋子——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4563 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列 ...

  7. [HAOI2016] 放棋子及错排问题

    题目 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足 ...

  8. BZOJ 4563: [Haoi2016]放棋子

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 389  Solved: 248[Submit][Status][Discuss] Descriptio ...

  9. BZOJ——T 4563: [Haoi2016]放棋子

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 387  Solved: 247[Submit][Status][Discuss] Descriptio ...

随机推荐

  1. PHP中判断变量为空的几种方法

    判断变量为空,在许多场合都会用到,同时自己和许多新手一样也经常会犯一些错误, 所以自己整理了一下PHP中一些常用的.判断变量为空的方法. 1. isset功能:判断变量是否被初始化本函数用来测试变量是 ...

  2. VBA笔记(一)

    开启VBA编程环境--VBE 方法一:按<Alt+F11>组合建 方法二:查看代码 宏设置 当然启用宏的设置方式不同,宏的启动方式也不一样. 首先打开"office 按钮&quo ...

  3. C# 使用Silverlight toolkit Chart

    一.基础介绍 Silverlight ToolKit是微软发布的基于Microsoft-Public License(MS-PL)许可协议的控件集.MS-PL许可协议允许商业或非商业的发布,所以我们可 ...

  4. 提高PHP代码质量的36个技巧

    1.不要使用相对路径 常常会看到: require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. 因此会 ...

  5. log4Net不能成功生成日志问题(关于配置错误)

    log4Net不能成功生成日志问题(关于配置错误) 调试发现问题原因在于  Log4Net IsInfoEnabled 一直为 false,返回的对象中所有 IsXXX 一直为false,这个问题的原 ...

  6. CSS自适应布局(左右固定 中间自适应或者右侧固定 左侧自适应)

    经常在工作中或者在面试中会碰到这样的问题,比如我想要个布局 右侧固定宽度 左侧自适应 或者 三列布局 左右固定 中间自适应的问题. 下面我们分别来学习下,当然我也是总结下而已,有如以下方法: 一: 右 ...

  7. Java批量文件打包下载

    经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...

  8. mac mysql cmd

    sudo /usr/local/mysql/support-files/mysql.server start sudo /usr/local/mysql/support-files/mysql.ser ...

  9. java 深入技术四(Set)

    1)Set接口 set接口的父接口-Collection set接口的重要子类-HashSet set接口的重要子类 -TreeSet set 接口的特别子类-LinkedHashSet 2)Hash ...

  10. C#与Java多态方面的语法差异

    C++.C#.Java,无奈三种语言让我多次混淆,多次搞清楚,不写个Demo我想还是会忘记的. 就好像是一个满水的杯子,倒掉一点,才能装下更多. 有时候博客就是一个倒水的地方,可以让我们清空自己,然后 ...