题目:Revenge of Fibonacci

题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000。

解析:本题可以分为两步:

第一步就是预处理出100000项斐波那契数列的前40位,插入到字典树中。

第二步就是查询匹配求最小的n。

对于第一步,我们可以把斐波那契数列精确到50多位,然后只存40位即可,这样就防止进位的误差。在斐波那契数列加法过程中,我们只把它的前50多

位进行相加,不然存不下。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N=10;
int f1[65],f2[65],f3[65];
class Trie
{
public:
int v;
int flag;
Trie *next[N];
Trie()
{
v=-1;
memset(next,NULL,sizeof(next));
}
};
Trie *root;
void Insert(char *S,int ans)
{
int len=strlen(S);
Trie *p=root;
for(int i=0;i<len;i++)
{
int id=S[i]-'0';
if(p->next[id]==NULL)
p->next[id]=new Trie();
p=p->next[id];
if(p->v<0) p->v=ans;
}
}
int Find(char *S)
{
Trie *p=root;
int count;
int len=strlen(S);
for(int i=0;i<len;i++)
{
int id=S[i]-'0';
p=p->next[id];
if(p==NULL) return -1;
else  count=p->v;
}
return count;
}
void Init()
{
int h;
char str[65]="1";
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
memset(f3,0,sizeof(f3));
f1[0]=1;f2[0]=1;
Insert(str,0);
for(int i=2;i<100000;i++)
{
memset(str,0,sizeof(str));
int r=0;
for(int j=0;j<60;j++)
{
f3[j]=f1[j]+f2[j]+r;
r=f3[j]/10;
f3[j]%=10;
}
for(int j=59;j>=0;j--)
if(f3[j])
{
h=j;
break;
}
int k=0;
for(int j=h;j>=0;j--)
{
str[k++]=f3[j]+'0';
if(k>=40) break;
}
Insert(str,i);
if(h>55)
{
for(int j=1;j<59;j++)
f3[j-1]=f3[j];
for(int j=1;j<59;j++)
f2[j-1]=f2[j];
}
for(int j=0;j<60;j++)
f1[j]=f2[j];
for(int j=0;j<60;j++)
f2[j]=f3[j];
}
}
int main()
{
root=new Trie();
Init();
char str[105];
int t,i,j,k=1;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
printf("Case #%d: ",k++);
int tmp=Find(str);
printf("%d\n",tmp);
}
return 0;
}

HDU4099(斐波那契数列与字典树)相关推荐

  1. 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  2. ZYH的斐波那契数列【线段树动态开点+矩阵快速幂求斐波那契】

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  3. 波菲那契数列公式_斐波那契数列为什么那么重要,所有关于数学的书几乎都会提到?...

    一句话先回答问题:因为斐波那契数列在数学和生活以及自然界中都非常有用. 下面我就尽我所能,讲述一下斐波那契数列. 一.起源和定义 斐波那契数列最早被提出是印度数学家Gopala,他在研究箱子包装物件长 ...

  4. hdu4099(斐波那契数+字典树)

    题意: 给出一个数字n,在斐波那契数列中找到一个最小下标,满足这个斐波那契数是以n为前缀,输出这个下标. 思路: 高精度+字典树+1000000000000000进制.后来知道在斐波那契数很大的时候, ...

  5. 斐波拉契数列python123_python计算机二级题目分类汇总

    知乎视频​www.zhihu.com 选择题:40 基本操作题:5 简单应用:10/15 综合应用:20 主要是对文本进行处理 基本操作题 format()函数 用符号填充 {序号:填充 对齐 宽度 ...

  6. 斐波那契数列算法(C#)

    上周抽了一天的时间去6家公司面试,时间太紧都是马马虎虎的,好在这趟面试还是有很多收获的,由此可见自己的理论功底真是差劲的要死,还有语言表达能力. 调侃的来说混了这么久,没有衣××的理论功底,只有雷×× ...

  7. 八十八、从斐波那契数列和零一背包问题探究动态规划

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划. ...

  8. 迭代求斐波那契数列python_python中的迭代器(以斐波那契数列为主讲解)

    简要引入: 迭代一词,我们再熟悉不过了,它经常出现在算法中,在数学中也有很多的使用,比如一个算法经过多少次的迭代,执行的效率有了很大的提高-- 迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过 ...

  9. Python:递归输出斐波那契数列

    今天学习Python的时候做一道练习题,题目是这样的: 题目 导入 问题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数 ...

最新文章

  1. 《团队合作大坑合集》
  2. 《预训练周刊》第39期: 深度模型、提示学习
  3. [Linux学习]虚拟机系统与实际系统共享文件的方式
  4. love2d杂记6--动态读写外部lua文件
  5. BZOJ2843:极地旅行社
  6. 如何利用MySQL加密函数保护Web网站敏感数据
  7. java以逗号截取字符串_使用java流获取逗号分隔的字符串
  8. mysql的存储过程的参数,MySQL存储过程中的参数
  9. Mozart Update 1(杯具额…)
  10. Failed to run the WC DB work queue associated with 错误的解决
  11. (转)MFC消息机制
  12. 数据结构:实验四 图的遍历
  13. Java的世界如此美妙
  14. 由于焦点冲突导致TextView的跑马灯效果和EditText不能共存的问题
  15. 条形码转化成二维码_免费在线条形码生成器_村美小站
  16. 使用element中el-tab如何改变文字样式等
  17. 凹凸手游服务器维护中是什么意思,凹凸世界手游测试炸服补偿公告介绍 开服进不去有什么补偿[多图]...
  18. Python 爬虫 之 爬取古代的诗歌,并保存本地(这里以爬取李白的所有诗歌为例)(以备作为AI写诗的训练数据)
  19. 面试连环炮之分布式锁
  20. qq手机浏览器不支持HTML5,手机QQ浏览器:响应HTML5未来 着眼当下

热门文章

  1. 获取指定包名下的所有类
  2. log4j2 异步日志
  3. MapReduce-流量统计求和-分区代码实现
  4. 多继承-注意父类之间注意不要有重名方法或属性
  5. 私有属性和方法-应用场景、定义方式和演练
  6. RocketMQ Filtersrv
  7. 作品分享_作品分享 | No. 1
  8. 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS
  9. 机器视觉-halcon学习笔记1
  10. 专门为ADO二层升三层的咏南中间件(特种用途)