BZOJ 1002 - 奇妙的题目 + 高精度
2015-12-29 00:10
246 查看
这道题有很多奇妙的方法可以搞。。最科学的当然是基尔霍夫矩阵(按照传统,“我也不知道是什么东西”),详见VFK教主的博客;还有乱七八糟的找规律,网上遍地都是。。我就把这题当作高精度练习题了。。
(你为什么又抄黄学长模板!?。。
(你为什么又抄黄学长模板!?。。
// BZOJ 1002 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxN=100+5, N=100+5; #define rep(i,a,b) for (int i=a; i<=b; i++) #define dep(i,a,b) for (int i=a; i>=b; i--) #define read(x) scanf("%d", &x) #define fill(a,x) memset(a, x, sizeof(a)) struct Big_int { int len, a[maxN]; // 1..len -> 个 十 百 ... void init() { len=0; fill(a, 0); } } f ; int n; // 高精度处理流程:先把数搞出来,然后作进退位,最后处理最高位 Big_int mul(Big_int a, int k) { // 高精*单精 rep(i,1,a.len) a.a[i]*=k; rep(i,1,a.len) { a.a[i+1]+=a.a[i]/10; a.a[i]%=10; } while (a.a[a.len+1]!=0) a.len++; return a; } Big_int sub(Big_int a, Big_int b) { // 高精-高精(顺便+2) a.a[1]+=2; int j=1; while (a.a[j]>=10) a.a[j+1]++, a.a[j]%=10, j++; // 处理进位,勿忘j++! rep(i,1,a.len) { a.a[i]-=b.a[i]; if (a.a[i]<0) { a.a[i]+=10; a.a[i+1]--; } } while (a.a[a.len]==0) a.len--; return a; } int main() { read(n); f[1].a[1]=1; f[2].a[1]=5; f[1].len=f[2].len=1; rep(i,3,n) f[i]=sub(mul(f[i-1], 3), f[i-2]); dep(i,f .len,1) printf("%d", f .a[i]); puts(""); return 0; }
相关文章推荐
- Linux笔记 磁盘管理fdisk,mek2fs,mount&unmount,分区表fstab
- HDU2021 发工资咯:)
- HashSet Integer输出有序,String输出无序
- 【转载】三年0故障总结,提升代码质量的秘诀
- 顺序表及其多种实现方式 --- C/C++
- ubuntu 将中文目录名改成英文
- ubuntu使用超级管理员root登录
- PAT 1011. A+B和C (15)
- 【mysql】使用脚本对mysql状态进行监控
- ubuntu无法安装vim软件包
- java开发中如何使用JVisualVM进行性能分析
- 运用swt制作一个简易计算器,附加关于html制作网页中的搜索框的一个小知识
- vs2010 如何去掉红色波浪线
- Hive UDF
- Android Battery 在framework相关介绍
- 数据库第一章
- MVVM实践教程
- 文章标题
- dom4j简单使用
- dom4j简单使用