BZOJ 2656 ZJOI 2012 数列(sequence) 高精度+记忆化搜索
来源:互联网 发布:淘宝卖家 收藏店铺 编辑:程序博客网 时间:2024/06/16 19:19
题目大意:定义个一序列,f[i] = f[i / 2] (i % 2 == 0);f[i] = f[i / 2] + f[i / 2 + 1] (i % 2 == 1);求这个数列的第m项(m <= 10 ^ 100)
思路:数据范围高精度没跑了。记得之前做过这个题的弱化版,似乎是没有高精度的记忆化搜索,这个题就是加个高精度。
CODE:
#include <map>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAX 210#define MO 10using namespace std;#define max(a,b) ((a) > (b) ? (a):(b)) class BigInt{private: int num[MAX],len;public: BigInt(int _ = 0) { memset(num,0,sizeof(num)); num[len = 1] = _; } void Read() { static char s[MAX]; scanf("%s",s); len = strlen(s); for(int i = 1; i <= len; ++i) num[i] = s[len - i] - '0'; } friend ostream &operator <<(ostream &os,const BigInt &a); bool operator <(const BigInt &a)const { if(len == a.len) { for(int i = len; i; --i) if(num[i] != a.num[i]) return num[i] < a.num[i]; } return len < a.len; } bool Odd()const { return num[1]&1; } BigInt operator +(const BigInt &a)const { BigInt re; re.len = max(len,a.len); int temp = 0; for(int i = 1; i <= re.len; ++i) { re.num[i] = temp + num[i] + a.num[i]; temp = re.num[i] / MO; re.num[i] %= MO; } if(temp) re.num[++re.len] = temp; return re; } BigInt operator /(int c)const { BigInt re; re.len = len; int temp = 0; for(int i = len; i; --i) { re.num[i] = (num[i] + temp) / 2; temp = (num[i] + temp) % 2 * MO; } while(!re.num[re.len]) --re.len; return re; }}temp; ostream &operator <<(ostream &os,const BigInt &a){ os << a.num[a.len]; for(int i = a.len - 1; i; --i) os << a.num[i]; return os;} map<BigInt,BigInt> G; int T; BigInt &MemorialSearch(const BigInt &a){ if(G.find(a) != G.end()) return G[a]; if(a.Odd()) G[a] = MemorialSearch(a / 2) + MemorialSearch(a / 2 + 1); else G[a] = MemorialSearch(a / 2); return G[a];} int main(){ G[0] = BigInt(0); G[1] = BigInt(1); for(cin >> T; T--;) { temp.Read(); cout << MemorialSearch(temp) << endl; } return 0;}
0 0
- BZOJ 2656 ZJOI 2012 数列(sequence) 高精度+记忆化搜索
- BZOJ 2656 ZJOI2012 数列(sequence) 高精度+记忆化搜索
- bzoj 2656 数列sequence 递归+高精度
- BZOJ 2656: [Zjoi2012]数列(sequence) 高精度
- [BZOJ 2656][Zjoi2012]数列(sequence):高精度+递推
- bzoj 2656: [Zjoi2012]数列(sequence)(简单高精度模板2.0)
- 【BZOJ 2656】 [Zjoi2012]数列(sequence)
- BZOJ 2656 [Zjoi2012] 数列(sequence)
- BZOJ 1079 记忆化搜索
- POJ_3181_记忆化搜索、高精度优化
- 【记忆化搜索】POJ-1141 Brackets Sequence
- BZOJ 3139 [Hnoi2013]比赛 记忆化搜索
- BZOJ 4562 食物链【记忆化搜索啊】
- |BZOJ 3183|记忆化搜索|[HAOI2016]食物链
- bzoj 1079(记忆化搜索)
- POJ 2506 高精度+递推+记忆化搜索
- 【递推】【高精度】[ZJOI2012]数列 sequence
- 带记忆化搜索的斐波那契数列
- android contentResolver与contentProvider如何关联在一起的
- leetcode 160-Intersection of Two Linked Lists
- 偶然性不可重现BUG怎么处理?
- 大型公司最盛行的六大开源项目
- R语言与数据分析之十:购物篮分析
- BZOJ 2656 ZJOI 2012 数列(sequence) 高精度+记忆化搜索
- 生成.X文件的一些方法&&DirectX获取及处理.X文件(初级版)
- Java所有关键字
- 线段树
- 目标关键词|搜索引擎优化工具|网站排名优化|网站排名|关键词分析
- Sketch使用教程(一)
- 基于wakeup_source的linux autosleep分析
- C语言--预处理指令、枚举、递归函数
- linux 查找目录或文件