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表示总障碍个数。
然后写高精度就行了。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
typedef long long ll;
const int maxn=410;
struct bign {
int len,s[maxn];
bign() {memset(s,0,sizeof(s));len=1;}
void operator = (int b) {
len=0;while(b) s[len++]=b%10,b/=10;
}
void clean() {while(len>1&&!s[len-1]) len--;}
bign operator + (const bign& b) const {
bign c;c.len=max(b.len,len)+1;
rep(i,0,c.len-1) {
c.s[i]+=s[i]+b.s[i];
c.s[i+1]+=c.s[i]/10;
c.s[i]%=10;
}
c.clean();return c;
}
bign operator - (const bign& b) const {
bign c;c.len=max(b.len,len);
rep(i,0,c.len-1) {
c.s[i]+=s[i]-b.s[i];
if(c.s[i]<0) c.s[i]+=10,c.s[i+1]--;
}
c.clean();return c;
}
bign operator * (const int b) const {
bign c;c.len=len+5;
int last=0;
rep(i,0,c.len-1) {
c.s[i]=s[i]*b+last;
last=c.s[i]/10;
c.s[i]%=10;
}
c.clean();return c;
}
bign operator * (const bign& b) const {
bign c;c.len=len+b.len+2;
rep(i,0,len-1) rep(j,0,b.len-1) c.s[i+j]+=s[i]*b.s[j];
rep(i,0,c.len-1) c.s[i+1]+=c.s[i]/10,c.s[i]%=10;
c.clean();return c;
}
void print() {dwn(i,len-1,0) printf("%d",s[i]);puts("");}
};
bign C[2][maxn],xp[maxn];
int main() {
int n=read(),k=0;
rep(i,1,n) rep(j,1,n) k+=read();
xp[0]=1;rep(i,1,n) xp[i]=xp[i-1]*i;
int cur=0;
rep(i,1,k) {
cur^=1;
C[cur][0]=1;C[cur][i]=1;
rep(j,1,i-1) C[cur][j]=C[cur^1][j-1]+C[cur^1][j];
}
bign ans=xp[n];
rep(i,1,k) {
bign res=C[cur][i]*xp[n-i];
if(i&1) ans=ans-res;
else ans=ans+res;
}
ans.print();
return 0;
}

  

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. thinkphp语言包

    1.config.php语言包相关配置. //开启语言包 'LANG_SWITCH_ON' => true, 'LANG_AUTO_DETECT' => true, // 自动侦测语言 开 ...

  2. python gutter area / 设置断点、行号右边代码左边的空白栏

    最后通过在设置里搜索 关键词:show 找到的.== Edito > General > Gutter Icons Show gutter icons

  3. Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended

    问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完 ...

  4. Android Studio的配置问题——Intel HAXM is required to run this AVD,VT-x is disabled in BIOS;

    Intel HAXM is required to run this AVD,VT-x is disabled in BIOS;Enable VT-x in your BIOS security se ...

  5. iOS开发

    #import 预处理指令,相对于 #include 而言,能防止重复拷贝,它可以导入OC头文件,也可以导入C头文件. OC中在一个框架中,有一个主头文件(该头文件名称一般跟框架名称相同),该主头文件 ...

  6. CSS gradient渐变之webkit核心浏览器下的使用

    一.关于渐变 渐变是一种应用于平面的视觉效果,可以从一种颜色逐渐地转变成另外一种颜色,故可以创建类似于彩虹的效果渐变可以应用在任何可以使用图片的地方.例如,您可以指定一个这么一个渐变:顶部的颜色是红色 ...

  7. Ajax跨域:Jsonp原理解析

    推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...

  8. C#常用类库(100多个)

    http://download.csdn.net/download/dxf1213cs/8238153

  9. C#高级编程笔记 Day 4, 2016年9月 12日(接口)

    1.定义和实现接口:接口名称通常上以字母 I 开头 例子:定义IBankAccount接口 namespace Test.YinXi{ public interface IBankAccount{ v ...

  10. 听说你们要开始学C了

    同学们好: 先自我介绍一下,我是你们的助教吴喆(厚颜无耻地要求大家叫我吉吉老师:-D),本科学的电子,所以陆陆续续接触了不少C/C++的工作,曾经被编码折磨得死去活来,如今却对其念念不舍,颇有点“斯德 ...