题意:

给出一个数字n,在斐波那契数列中找到一个最小下标,满足这个斐波那契数是以n为前缀,输出这个下标。

思路:

高精度+字典树+1000000000000000进制。后来知道在斐波那契数很大的时候,只取前60位相加得到的前40位就是原斐波那契数的前40位。

代码:

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
typedef long long LL;
const LL mod = 1000000000000000;const int m = 2000;
LL b[10][m + 10];const int maxn = 10000005;
int tire[maxn][11];
int flag[maxn];
int tot;
void init2() {memset(tire, 0, sizeof(tire));memset(flag, -1, sizeof(flag));tot = 1;
}
void add(string s, int rt, int nn) {for(int i = 0; s[i]; i++) {int x = s[i] - '0';if(tire[rt][x] == 0) {tire[rt][x] = tot++;flag[tire[rt][x]] = nn;}rt = tire[rt][x];}
}
int cal(string s, int rt) {for(int i = 0; s[i]; i++) {int x = s[i] - '0';if(tire[rt][x] == 0) {return -1;}rt = tire[rt][x];}return flag[rt];
}
void print(int n, int nn) {bool flag = false;string s = "";bool f1 = false;int k = 0;for(int i = 0; i <= m; i++) {char str[20] = "";if(flag) {sprintf(str,"%015lld", b[n][i]);} else {if(b[n][i] != 0) {sprintf(str,"%lld", b[n][i]);flag = true;}}for(int j = 0; str[j]; j++) {s += str[j]; k++;if(k >= 40) {f1 = true;break;}}if(f1) break;}add(s, 0, nn);
//cout << s << " " << nn << endl;
}
int A(int x) {if(x % 3 == 0) return 3;return x % 3;
}
void init() {int nn = 0;b[1][m] = 1;print(1, nn++);b[2][m] = 1;print(2, nn++);for(int i = 3; i <= 100000; i++) {int now = A(i); int a1 = A(i - 1 + 3); int a2 = A(i - 2 + 3);for(int j = m; j >= 0; j--) {b[now][j] = b[a1][j] + b[a2][j];}for(int j = m; j >= 0; j--) {b[now][j - 1] += b[now][j] / mod;b[now][j] %= mod;}print(now,nn++);}
}int main() {init2();init();int t;scanf("%d",&t);for(int k = 1; k <= t; k++) {string s;cin >> s;printf("Case #%d: %d\n", k,cal(s,0));}
}

hdu4099(斐波那契数+字典树)相关推荐

  1. 树上问题 ---- E. Fib-tree(斐波那契数的性质 + 暴力模拟 + 认真计算复杂度)

    题目大意: 一个树是FIBFIBFIB树得是节点个数为斐波那契数,且(注意这个且)!!此外满足下面条件一个: 1.只有一个点 2.可以切一条边使得分出的两个子树都是FIBFIBFIB树. 给你一棵树, ...

  2. 斐波那契数与二分法的递归与非递归算法及其复杂度分析

    1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...

  3. 在计算机科学中算法指的是,算法 - 为什么斐波纳契数在计算机科学中具有重要意义?...

    算法 - 为什么斐波纳契数在计算机科学中具有重要意义? Fibonacci数字已经成为计算机科学学生递归的一个流行的介绍,并且有一个强烈的论据,他们坚持在自然界. 出于这些原因,我们很多人都熟悉它们. ...

  4. 用x种方式求第n项斐波那契数,99%的人只会第一种

    作者: C you again,从事软件开发 努力在IT搬砖路上的技术小白 公众号: [C you again],分享计算机类毕业设计源码.IT技术文章.游戏源码.网页模板.程序人生等等.公众号回复 ...

  5. 算法----斐波那契数

    題目 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F ...

  6. 动态规划学习之三种方法解决斐波拉契数

    斐波拉契数是一个很经典的问题,也会很多公司面试的考题,每个学习计算机的同学都会接触这个问题,尤其是在学习递归的时候,利用递归来解决斐波拉契数是很多教材采用的一个例子,所以很多同学一想到斐波拉契马上就会 ...

  7. LeetCode-动态规划基础题-509. 斐波那契数

    描述 题目如下: 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0 ...

  8. 阶乘与斐波那契数的理解

    在算法导论第三章中,提到了阶乘和斐波那契数,颠覆或者说是加深了我以前对这两种数的理解.以前是无法想象这个数有多大,但现在是有了一个概念. 阶乘 阶乘的定义为 n!= n>0?1:n*(n-1)! ...

  9. [算法学习]斐波那契数的计算

    决定开始看algorithms,而且尽量多思考,多写点代码.第一个碰到的算法就很具有启发性,一些看似正确的算法,实际的复杂度却很高.我们直接看问题: 问题:假设fibonacci(0)=0,fibon ...

最新文章

  1. linux centos 查找命令 属于哪个安装包 所属软件包
  2. 青海省西宁市职称计算机考试试题,【青海西宁2017年第一批职称计算机考试时间4月8日起】- 环球网校...
  3. 习题7-2 求一批整数中出现最多的个位数字 (20分)
  4. C# winform中ListView用法
  5. Go的反射是如何获取结构体成员信息的?
  6. [Java] 蓝桥杯ALGO-139 算法训练 s01串
  7. 8.5 意境级讲解迁移学习
  8. cannot run program “google-chrome“: error=2, 没有那个文件或目录
  9. 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系.pdf
  10. java语言简介总结
  11. 51单片机(二)—— 如何烧写51单片机程序
  12. Python学习历程-1-20180630
  13. [置顶] 以盛唐气象,浇胸中块垒:唐诗与宋词学习笔记汇总目录
  14. 经典之打印沙漏-数学分析-C/C++
  15. 在 Activity 中添加 Menu 菜单
  16. 搜索与问答——【NeurIPS 2021】BEIR:信息检索模型零样本评估的异构基准
  17. 石川 :学术界、管理人、投资者视角下的因子投资
  18. YOLO系列-yolov3
  19. 计算机组成的了LDAR,静态存储器实验报告
  20. 串口硬盘与并口硬盘的区别

热门文章

  1. 最后一课2018-11-11
  2. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170408
  3. GitHub 中文排行榜,高分优秀中文项目一网打尽!
  4. android 小球效果,Android开发实现跟随手指的小球效果示例
  5. win10休眠_win10休眠重新开机黑屏进入不了系统
  6. 获取keras中间层输出、模型保存与加载
  7. Delphi下载指定网址(URL)的文件,带进度条显示
  8. 通过崩溃地址找错误行数之Delphi版
  9. javascript闭包产生的内存泄漏
  10. 为什么`malloc`出来的内存也能当成对象正常使用