题意:
      给你一个串(最长40位)问你这个串是斐波那契F(n)  n <= 99999中的那个数的前缀,如果存在多个输出最小的n否则输出-1.

思路:
      给的串最长40位,那么就直接把所有的斐波那契全求出来(每个要前40位,求

的时候多求几位,省着精度出问题,不能全求出来,存不下)求出来后把他们建在一颗字典树里面,建树的时候注意开一个变量记住当前位置的这个字母最早出现的是第几个斐波那契数,然后对于每组询问,直接查找就行了。


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Tree
{Tree *next[10];int v;
}Tree;Tree root;void Buid_Tree(char *str ,int vv)
{int len = strlen(str);Tree *p = &root ,*q;for(int i = 0 ;i < len ;i ++){int id = str[i] - '0';if(p -> next[id] == NULL){q = (Tree *) malloc(sizeof(root));q -> v = vv;for(int j = 0 ;j < 10 ;j ++)q -> next[j] = NULL;p -> next[id] = q;p = p -> next[id];}else p = p -> next[id];}
}int Find(char *str)
{int len = strlen(str);Tree *p = &root;for(int i = 0 ;i < len ;i ++){int id = str[i] - '0';if(p -> next[id] == NULL) return -1;p = p -> next[id];}return p -> v;
}void Buid()
{int a[80] ,b[80] ,c[80];char str[60];for(int i = 0 ;i < 10 ;i ++)root.next[i] = NULL;str[0] = '1' ,str[1] = '\0';Buid_Tree(str ,0);memset(a ,0 ,sizeof(a));memset(b ,0 ,sizeof(b));memset(c ,0 ,sizeof(c));a[1] = b[1] = 1;for(int i = 2 ;i < 100000 ;i ++){for(int j = 1 ;j <= 60 ;j ++)c[j] = a[j] + b[j];for(int j = 1 ;j <= 60 ;j ++)c[j+1] += c[j] / 10 ,c[j] %= 10;int max = 0;for(int j = 60 ;j >= 1 ;j --)if(c[j]){max = j; break;}int k = 0;for(int j = max ;j >= 1 ;j --){str[k++] = c[j] + '0';if(k == 40) break;}str[k] = '\0';Buid_Tree(str ,i);if(max > 55){for(int j = 6 ;j <= 60 ;j ++)b[j - 5] = b[j] ,c[j - 5] = c[j];for(int j = 56 ;j <= 60 ;j ++)b[j] = c[j] = 0;}for(int j = 1 ;j <= 60 ;j ++){a[j] = b[j];b[j] = c[j];c[j] = 0;}}
}int main ()
{int t ,cas = 1;char str[50];Buid();scanf("%d" ,&t);while(t--){scanf("%s" ,str);printf("Case #%d: %d\n" ,cas ++ ,Find(str));}return 0;
}

hdu 4099 字典树 + 斐波那契相关推荐

  1. HDU - 1568 Fibonacci (斐波那契,大数取前几位

    2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>= ...

  2. 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)

    分析:x=1234567.求其前四位数: log10(x)=log10(1.234567)+6. 所以1.234567=10^(log10(x)-6). 1234 =(int) 10^(log10(x ...

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

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

  4. HDU4099(斐波那契数列与字典树)

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

  5. HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  6. Codeforces 446C. DZY Loves Fibonacci Numbers【斐波那契+线段树】

    C. DZY Loves Fibonacci Numbers [题目描述] 传送门 [题解] 我们可以知道斐波那契数列有两个性质: ∑i=1nFi=Fn+2−F2\sum_{i=1}^{n} F_i= ...

  7. HDU 2814 斐波那契循环节 欧拉降幂

    一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...

  8. hdu 1316 斐波那契数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1316 意思很简单,就是让你计算在两个数之间有多少个斐波那契数,很挫的时我一开始把string的比较给搞 ...

  9. 洛谷 P3404 斐波那契(线段树)

    传送门 首先肯定是线段树,然后问题就是怎么打标记. 观察题目,可以发现,修改操作其实就是给一段区间加上从1到r-l+1的斐波那契数列. 那么思路就是:预处理斐波那契数列前缀和,这样可以O(1)查询斐波 ...

最新文章

  1. Resources about Rx(Reactive Extensions)
  2. Spring学习的切入点
  3. leetcode-Symmetric Tree 对称树
  4. Synchronize使用
  5. 【转】store_schema.sql
  6. Django 部署基础【使用 Nginx + uWSGI 的方式来部署来 Django】
  7. 新概念51单片机C语言教程纠错(3)
  8. c语言中空格字符怎么表示_C语言中常用的字符串操作函数
  9. 语言中预算符号的优先级_Perl语言入门系列之一
  10. 辽宁省沈阳市谷歌高清卫星地图下载
  11. 0xc000007b的解决办法(续)
  12. 【优化求解】基于生物地理学结合重力引力搜索优化求解算法matlab代码
  13. dedecms---一个简单酷站的构建及解析
  14. 科学巨星的美丽轨迹——走近博弈论大师纳什
  15. EXCEL表格-数据拆分及分列
  16. VOS3000怎样给对接网关设置按主叫号码计费
  17. TCP/IP网络编程——IO复用
  18. 模拟电子技术(一)半导体二极管和三极管
  19. 《诛仙四级考试》试卷
  20. 8、【循环练习-蜗牛爬井】井里有一只蜗牛,他白天往上爬5米,晚上掉3.5 米,井深56.7米,计算蜗牛需要多少天才能从井底到爬出来。

热门文章

  1. 使用OKHttp3实现下载(断点续传、显示进度)
  2. 家属楼如何设置使用免费wifi
  3. MySQL学习笔记_9_MySQL高级操作(上)
  4. XE5 Android 开发数据访问手机端 解决乱码的办法
  5. SessionID 的本质
  6. apache的防DDOS模块-mod_evasive
  7. python字符串和字典
  8. C# 字符串大小写混合转换(同时进行)
  9. linux 启动rabbitmq 报错:
  10. 跨域问题汇总【已收录 CORS JSONP】