您的位置:首页 > 其它

【bzoj4563】【HAOI2016】【放棋子】【高精度】

2016-05-17 10:14 309 查看

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>
struct use{int a[1000];}f[210];
int n;
using namespace std;
use operator +(use a,use b){
use c;
int t(0);
c.a[0]=max(a.a[0],b.a[0]);
for (int i=1;i<=c.a[0];i++){
c.a[i]=a.a[i]+b.a[i]+t;
if (c.a[i]>=10){t=c.a[i]/10;c.a[i]%=10;}
else t=0;
}
if(t>0) c.a[++c.a[0]]=t;
return c;
}
use operator *(int x,use a){
int t(0);
for (int i=1;i<=a.a[0];i++) a.a[i]*=x;
for (int i=1;i<=a.a[0];i++){
a.a[i]+=t;
if (a.a[i]>=10){t=a.a[i]/10;a.a[i]%=10;}
else t=0;
}
while (t){a.a[++a.a[0]]=t%10;t/=10;}
return a;
}
int main(){
//f[i]=(i-1)*(f[i-1]+f[i-2])
scanf("%d",&n);
f[1].a[1]=0; f[2].a[1]=f[1].a[0]=f[2].a[0]=1;
for (int i=3;i<=n;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
for (int i=f
.a[0];i>=1;i--)
printf("%d",f
.a[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: