vijosP1687 细菌总数
2015-10-14 11:47
29 查看
vijosP1687 细菌总数
链接:https://vijos.org/p/1687
【思路】
错排公式+高精度。
题目要求排列数目而且不能有Pi==i的情况出现,可以看出这正是1,2,3,4,5,…n的错排数目。应用错排公式以及高精高精加、高精单精乘即可。
【代码】
链接:https://vijos.org/p/1687
【思路】
错排公式+高精度。
题目要求排列数目而且不能有Pi==i的情况出现,可以看出这正是1,2,3,4,5,…n的错排数目。应用错排公式以及高精高精加、高精单精乘即可。
【代码】
#include<iostream> #include<cstring> #include<cmath> using namespace std; struct Bign{ int len,N[3001]; Bign() { memset(N,0,sizeof(N)); } }; int n; void Add(Bign& a,Bign b) { a.len=max(a.len,b.len); for(int i=0;i<a.len;i++) { a.N[i] += b.N[i]; a.N[i+1] += a.N[i]/10; a.N[i] %= 10; } if(a.N[a.len]) a.len++; } void multi(Bign& a,int x) { for(int j=0;j<a.len;j++) a.N[j] *= x; int i=0; while(i<a.len || a.N[i]>10) { a.N[i+1] += a.N[i]/10; a.N[i] %= 10; i++; //i++ } if(a.N[i]) a.len=i+1; //判断 else a.len=i; } int main() { cin>>n; Bign D[3]; D[0].len=D[1].len=D[2].len=1; D[0].N[0]=1; D[1].N[0]=0; for(int i=2;i<=n;i++) { memset(D[2].N,0,sizeof(D[2].N)); Add(D[2],D[0]); Add(D[2],D[1]); multi(D[2],i-1); D[0]=D[1]; D[1]=D[2]; } for(int i=D[2].len-1;i>=0;i--) cout<<D[2].N[i]; return 0; }
相关文章推荐
- C++从Txt中读取内容
- 屏幕旋转方向
- Java泛型详解
- WebService实战(二)——在Web项目中创建CXF服务
- python脚本使用SFTP下载远程计算机文件
- 关于完美洗牌问题的若干思考(扩展)
- HTML meta viewport属性说明
- 计算机视觉中的曲率尺度空间技术
- Win32 API 心得
- win10自带邮件怎么设置接收网易邮箱邮件?
- Android 工具类 —— 判断网络连接状态、GPS是否打开、基站信息和手机IMSI码
- git之Pushing to the remote branch is not fast-forward错误解决
- 随机数的使用
- static加载问题
- 【总结】Mac版Android Studio常用快捷键总结
- svn 把本地的项目,上传到服务器端
- 响应式网页设计【转载】
- POJ 1007 DNA Sorting
- wireshark cannot find interface
- ArcGIS教程:值提取至点 (空间分析)