hrbust 1209/hdu 4099 Revenge of Fibonacci【字典树+大数】

Revenge of Fibonacci
Time Limit: 5000 MS Memory Limit: 204800 K
Total Submit: 37(24 users) Total Accepted: 18(17 users) Rating:  Special Judge: No
Description

The well-known Fibonacci sequence is defined as following:

F(0) = F(1) = 1

F(n) = F(n - 1) + F(n - 2) (n >= 2)

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.

Input
  There 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.

Output
  For 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.
Sample Input
15

1

12

123

1234

12345

9

98

987

9876

98765

89

32

51075176167176176176

347746739

5610

Sample Output
Case #1: 0

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

Source
2011 Asia Shanghai Regional Contest
Recommend
齐达拉图

题目大意:给出长度不超过40的串,表示一个斐波那契数列的前缀,如果在100000个斐波那契数里边找到了有这样前缀的一个斐波那契数,输出其编号。

分析:因为是维护前缀,所以在大数加法的时候,如果长度过长,我们需要去掉个位上的数字。对于每一个斐波那契数前缀都加入字典树中,然后输入进来的每一个查询即可。

AC代码:(感谢

?α??杉

学长的代码0.0)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    char c[50];
    int len;
}f[100010];
struct node1
{
	int nx[10];//0-9
	int now;//now表示编号
}tree[4500000];
void add(node &ret,node &a,node &b)
{
	int i,j,k,t,len=a.len;
	k=t=0;
	for(i=0;i<len;i++)
	{
		t=(a.c[i]+b.c[i]+k)/10;
		ret.c[i]=(a.c[i]+b.c[i]+k)%10;
		k=t;
	}
	ret.len=len;
	if(k!=0)
		ret.c[ret.len++]=k;
	if(ret.len>48)
	{
		for(i=0;i<ret.len;i++)
		{
			ret.c[i]=ret.c[i+1];
			a.c[i]=a.c[i+1];
		}
		ret.len--;
		a.len--;
	}
}
int num=1;//节点个数.
void insert(int k)
{
    int p=0;
    for(int i=f[k].len-1;i>=0;i--)
    {
        int tmp=f[k].c[i];
        if(tree[p].nx[tmp]==0)
        {
            tree[p].nx[tmp]=num++;
        }
        p=tree[p].nx[tmp];
        tree[p].now=k;
    }
}
int main()
{
    f[0].c[0]=1;f[0].len=1;
    f[1].c[0]=1;f[1].len=1;
    for(int i=2;i<=100005;i++)
    {
        add(f[i],f[i-1],f[i-2]);
    }
    for(int i=99999;i>=0;i--)
    {
        insert(i);
    }
    int t;
    int kase=0;
    scanf("%d",&t);
    while(t--)
    {
        char ss[50];
        int p=0,ans;
        scanf("%s",ss);
        for(int i=0;ss[i];i++)
        {
            int tmp=ss[i]-'0';
            if(tree[p].nx[tmp]==0)
            {
                ans=-1;
                break;
            }
            p=tree[p].nx[tmp];
            ans=tree[p].now;
        }
        printf("Case #%d: %d\n",++kase,ans);
    }
}
时间: 2024-10-16 17:03:43

hrbust 1209/hdu 4099 Revenge of Fibonacci【字典树+大数】的相关文章

hdu 4099 Revenge of Fibonacci(字典树)

Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/Others) Total Submission(s): 2355    Accepted Submission(s): 587 Problem Description The well-known Fibonacci sequence is defined as following: Here w

hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法

Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输出-1: 思路:直接使用数组模拟加法,再用Trie树插入查找即可:但是一般使用new Trie()的代码都是MLE的.反而我之前写的,直接得到数组大小的maxnode版本的内存可以接受:并且还有一点就是前40位的精度问题:由于是自己计算出来的finboncci数列,并不是系统给的,所以1的进位不会形成递推

HDU 4099 Revenge of Fibonacci

Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/Others) Total Submission(s): 2027    Accepted Submission(s): 475 Problem Description The well-known Fibonacci sequence is defined as following: Here w

HDU 4099 Revenge of Fibonacci Trie+高精度

Revenge of Fibonacci Problem Description The well-known Fibonacci sequence is defined as following: 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

hdu 1247 Hat’s Words 字典树

// hdu 1247 Hat's Words 字典树 // // 题目大意: // // 在一些字符串中,找到这样字符串:由两个其他的字符串构成 // // 解题思路: // // 字典树,先将这些字符串插入到字典树中,然后枚举断点,如果 // 字符串的前后两段都找到了,输出该串即可~ // // 感悟: // // 这道题目的话,就是字典树上的暴力嘛,细节方面还是要多多注意 // val值还是不能少哟~因为查找到了该串,不一定是一个单词,可能 // 是中间的一个节点,即某个字符串的前缀~~~

[ACM] hdu 1251 统计难题 (字典树)

统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每一个提问都是一个字符串. 注意:本题仅仅有一组測试数据,处理到文件结束. Out

HDU 1250 Hat&#39;s Fibonacci(Java大数相加)+讲解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1. F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n -

HDU 2094 产生冠军 (字典树+拓扑)

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8591    Accepted Submission(s): 4047 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打

hdu 5018 Revenge of Fibonacci(BestCoder Round #10)

Revenge of Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 372    Accepted Submission(s): 177 Problem Description In mathematical terms, the sequence Fn of Fibonacci numbers is define