BZOJ 4563: [Haoi2016]放棋子

来源:互联网 发布:python 回滚 编辑:程序博客网 时间:2024/05/17 09:27

4563: [Haoi2016]放棋子

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 281  Solved: 179
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

2
0 1
1 0

Sample Output

1


这个障碍图给的毫无卵用,由错排公式直接得结果

重要的是不要跳进高精度的坑


#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;struct big{int a[1000];}f[250];int n;big operator + (big b,big c){    big d;    int temp=0;    d.a[0]=max(b.a[0],c.a[0]);    for(int i=1;i<=d.a[0];i++)    {        d.a[i]=c.a[i]+b.a[i]+temp;        temp=d.a[i]/10;d.a[i]=d.a[i]%10;    }    while(temp)d.a[++d.a[0]]=temp%10,temp/=10;    return d;}big operator * (int t,big c){    int temp=0;    for(int i=1;i<=c.a[0];i++)    c.a[i]*=t;    for(int i=1;i<=c.a[0];i++)    c.a[i]+=temp,temp=c.a[i]/10,c.a[i]%=10;    while(temp)c.a[++c.a[0]]=temp%10,temp/=10;    return c;}int main(){    scanf("%d",&n);    f[1].a[1]=0;f[1].a[0]=f[2].a[1]=f[2].a[0]=1;    for(int i=3;i<=n;i++)    f[i]=(i-1)*(f[i-1]+f[i-2]);    f[1].a[1]=1;    for(int i=f[n].a[0];i>=1;i--)    printf("%d",f[n].a[i]);}




0 0
原创粉丝点击