【bzoj4563】【HAOI2016】【放棋子】【高精度】
2016-05-17 10:14
309 查看
Description
给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行只有一枚棋子,每列只有一枚棋子
的限制,求有多少种方案。
Input
第一行一个N,接下来一个N*N的矩阵。N<=200,0表示没有障碍,1表示有障碍,输入格式参考样例Output
一个整数,即合法的方案数。Sample Input
20 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]); }
相关文章推荐
- Linux下设置帧和socket缓冲区的大小
- 各种开源UI
- linux网络编程之socket(五):tcp流协议产生的粘包问题和解决方案
- 系统之间通讯方式—SOAP(web service)
- Vim编辑快捷键
- Android Cross Compile Tools
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
- Python 常见错误
- YJX_rxjh_20_3.2.2
- [javaSE] 数组(查找-二分查找)
- JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
- 深入剖析浏览器退出之后php还会继续执行么
- Android下拉刷新上拉加载控件,对所有View通用!
- 小米兰亭字体_下载
- Push时间过短引起程序Crash
- Javascript 严格模式详解
- 在 Oculus和 Gear VR上开发跨平台的 VR应用
- iTop4412驱动实验手册快捷笔记
- UI控件笔记(七):UI之五种传值方式 代理\单例\缓存\通知\正向
- 在 Oculus和 Gear VR上开发跨平台的 VR应用