HDU4099 Revenge of Fibonacci(高精度+Trie)
Revenge of Fibonacci
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 204800/204800 K (Java/Others)
Total Submission(s): 2582 Accepted Submission(s): 647
Here we regard n as the index of the Fibonacci number F(n).
This
sequence has been studied since the publication of Fibonacci's book
Liber Abaci. So far, many properties of this sequence have been
introduced.
You had been interested in this sequence, while after
reading lots of papers about it. You think there’s no need to research
in it anymore because of the lack of its unrevealed properties.
Yesterday, you decided to study some other sequences like Lucas sequence
instead.
Fibonacci came into your dream last night. “Stupid human
beings. Lots of important properties of Fibonacci sequence have not been
studied by anyone, for example, from the Fibonacci number 347746739…”
You
woke up and couldn’t remember the whole number except the first few
digits Fibonacci told you. You decided to write a program to find this
number out in order to continue your research on Fibonacci sequence.
are multiple test cases. The first line of input contains a single
integer T denoting the number of test cases (T<=50000).
For each
test case, there is a single line containing one non-empty string made
up of at most 40 digits. And there won’t be any unnecessary leading
zeroes.
each test case, output the smallest index of the smallest Fibonacci
number whose decimal notation begins with the given digits. If no
Fibonacci number with index smaller than 100000 satisfy that condition,
output -1 instead – you think what Fibonacci wants to told you beyonds
your ability.
1
12
123
1234
12345
9
98
987
9876
98765
89
32
51075176167176176176
347746739
5610
Case #2: 25
Case #3: 226
Case #4: 1628
Case #5: 49516
Case #6: 15
Case #7: 15
Case #8: 15
Case #9: 43764
Case #10: 49750
Case #11: 10
Case #12: 51
Case #13: -1
Case #14: 1233
Case #15: 22374
【思路】
高精度加法+Trie。
离线处理出F()以内所有的F在长度40以内的前缀并构造一棵字典树。因为精度原因,保留60位进行加法计算就可以达到精确。
Trie的结点维护一个val表示经过该节点的所有字符串中的最小标号,对应每一个查询用O(maxn)的时间求解。
总的时间复杂度为O(99999*60+T*maxn)。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int sigmasize = ;
//Trie相关
struct Node{
int val;
Node* next[sigmasize];
};
struct Trie{
Node *root;
Trie() {
root=new Node;
for(int i=;i<sigmasize;i++) root->next[i]=NULL;
root->val=;
}
int idx(char c) { return c-''; }
void insert(char* s,int v) {
int n=strlen(s);
Node* u=root;
for(int i=;i<min(n,);i++) {
int c=idx(s[i]);
if(u->next[c]==NULL) {
Node* tmp=new Node;
tmp->val=;
for(int i=;i<sigmasize;i++) tmp->next[i]=NULL;
u->next[c]=tmp;
}
u=u->next[c];
if(u->val==) u->val=v;
}
if(u->val==) u->val=v; //存储最小的F
}
int find(char* s) {
int n=strlen(s);
Node* u=root;
for(int i=;i<min(n,);i++) {
int c=idx(s[i]);
if(u->next[c]==NULL) return ;
else u=u->next[c];
}
return u->val;
}
void del(Node *root) {
for(int i=;i<sigmasize;i++) {
if(root->next[i]!=NULL) del(root->next[i]);
}
free(root);
}
}trie;
//题目相关
int n;
const int maxn = ;
char F1[maxn],F2[maxn],Ftmp[maxn],s[maxn];
char d[maxn]; void Add(char *a,char *b,char *c)
{
int i,j,k,aa,bb,t=,p=;
aa=strlen(a)-,bb=strlen(b)-;
while(aa>=||bb>=) {
if(aa<)i=; else i=a[aa]-'';
if(bb<)j=; else j=b[bb]-'';
k=i+j+t;
d[p++]=k%+'';
t=k/;
aa--,bb--;
}
while(t) {
d[p++]=t%+'';
t=t/;
}
for(i=;i<p;i++) c[i]=d[p-i-];
c[p]='\0';
} int main() {
F1[]='',F1[]='\0';
F2[]='',F2[]='\0';
trie.insert(F1,),trie.insert(F2,);
FOR(i,,-) {
strcpy(Ftmp,F2);
int len1=strlen(F1),len2=strlen(F2);
if(len1>) {
F1[]=F2[]='\0';
}
Add(F1,F2,F2);
trie.insert(F2,i+);
strcpy(F1,Ftmp);
}
int T,kase=;
scanf("%d",&T);
while(T--) {
scanf("%s",s);
int ans=trie.find(s);
if(!ans) ans=-; else ans--;
printf("Case #%d: %d\n",++kase,ans);
}
trie.del(trie.root);
return ;
}
HDU4099 Revenge of Fibonacci(高精度+Trie)的更多相关文章
- HDU 4099 Revenge of Fibonacci(高精度+字典树)
题意:对给定前缀(长度不超过40),找到一个最小的n,使得Fibonacci(n)前缀与给定前缀相同,如果在[0,99999]内找不到解,输出-1. 思路:用高精度加法计算斐波那契数列,因为给定前缀长 ...
- TZOJ 3820 Revenge of Fibonacci(大数+trie)
描述 The well-known Fibonacci sequence is defined as following: Here we regard n as the index of the F ...
- hdu4099 Revenge of Fibonacci
题意:给定fibonacci数列,输入前缀,求出下标.题目中fibonacci数量达到100000,而题目输入的前缀顶多为40位数字,这说明我们只需要精确计算fibinacci数前40位即可.查询时使 ...
- UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树
题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...
- hdu4099 Revenge of Fibonacci 字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099 思想很容易想到 就是预处理出前10w个的fib数,然后建树查询 建树时只用前40位即可,所以在计 ...
- HDU 4099 Revenge of Fibonacci Trie+高精度
Revenge of Fibonacci Problem Description The well-known Fibonacci sequence is defined as following: ...
- hdu 4099 Revenge of Fibonacci 大数+压位+trie
最近手感有点差,所以做点水题来锻炼一下信心. 下周的南京区域赛估计就是我的退役赛了,bless all. Revenge of Fibonacci Time Limit: 10000/5000 MS ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- UVa12333 Revenge of Fibonacci
高精度 trie 暴力预处理出前100000个fibonacci数,将每个数的前40位数字串插入到trie中,记录每个结点最早可以由哪个数字串到达. 然后依次回答询问即可. 存fibonacci数的数 ...
随机推荐
- Java-strurs总结
这里是自己对自学的struts2 的一个整体 的脉络进行的一个概括,需要学习哪些东西,注重哪些东西: struts2 是主流框架SSH 中的一个"S" ,准备MVC开发标准的一个框 ...
- DataTable和List集合互转
/// <summary> /// 将集合转换成DataTable /// </summary> /// <param name="list"> ...
- 如何配置visual studio 2013进行负载测试-万事开头难
声明:工作比较忙,文章写得不好,有时间再整理. 起因:最近众包平台因迁移到azure之后一直有网站慢的情况,让老板挨批了,但是测试环境一切正常,而且生产环境也没发现有卡顿和慢的情况,所以干脆来一次负载 ...
- List<T>取交集、差集、并集
1. 取交集 (A和B都有) List A : { 1 , 2 , 3 , 5 , 9 }List B : { 4 , 3 , 9 }var intersectedList = list1.Inte ...
- POJ2104 K-th Number 静态区间第k最值 平方分割
干掉这道题的那一刻,我只想说:我终于**的AC了!!! 最终内存1344K,耗时10282ms,比起归并树.划分树以及其他各种黑科技,这个成绩并不算光彩⊙﹏⊙ 但至少,从最初的无数次TLE到最终的AC ...
- SGU 190.Dominoes(二分图匹配)
时间限制:0.25s 空间限制:4M 题意: 给定一个N*N的棋盘,一些格子被移除,在棋盘上放置一些1*2的骨牌,判定能否放满,并且输出任意方案. Solution: 首先考虑对棋盘的一个格子黑白染色 ...
- Python中%s和%r的区别
早先使用Python工作的时候,对于格式化输出%s和%r的使用都是混着用的. 这一次就出错了: cu.execute("insert into ipPool values(null, '%r ...
- Spring MVC 获取前端参数的注解
在与前端交互的开发过程中,出现过几次无法取到参数的情况,费了些时间去排查问题,下面就简单总结一下. 注解详解 我们所要获取的前端传递参数大概可以分为以下四类: requet uri 部分的注解:@Pa ...
- spring mvc easyui tree 异步加载树
使用spring mvc 注解 异步加载一棵树 jsp: <ul id="orgInfoTree"></ul> $(function(){ loadOrgT ...
- php实现返回上一页的功能的3种有效方法
php实现返回上一页的功能的3种有效方法 header(location:你的上一页的路径); // 注意这个函数前不能有输出 header(location:.getenv("HT ...