HDU--4099

题目:

Revenge of Fibonacci

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099

分析:字典树的应用。在求Fibonacci的前40位时,可以只记录下前60位,舍去后面的,这样不会因为进位而产生误差。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<string>
  6 #include<algorithm>
  7 #include<map>
  8 #define maxn 6000005
  9 using namespace std;
 10 char s[44],s1[101],s2[101],s3[101];
 11 char c[101];
 12 int ans=0;
 13 void padd(char *a,char *b,char *back)
 14 {
 15     int i,j,k,x,y,z,up;
 16     i=strlen(a)-1;
 17     j=strlen(b)-1;
 18     k=0;
 19     up=0;
 20     while(i>=0||j>=0)
 21     {
 22         if(i<0)x=0;
 23         else x=a[i]-'0';
 24         if(j<0)y=0;
 25         else y=b[j]-'0';
 26         z=x+y+up;
 27         c[k++]=z%10+'0';
 28         up=z/10;
 29         i--;
 30         j--;
 31     }
 32     if(up>0)c[k++]=up+'0';
 33     for(i=0;i<k;i++)back[i]=c[k-1-i];
 34     back[k]='\0';
 35 }
 36 
 37 struct Trie
 38 {
 39     Trie *next[10];
 40     int count;
 41 };
 42 Trie *root,memory[maxn];
 43 int cnt=0;
 44 Trie* build()
 45 {
 46     Trie *p=&memory[cnt++];
 47     p->count=-1;
 48     for(int i=0;i<10;i++)
 49     p->next[i]=NULL;
 50     return p;
 51 }
 52 void insert_node(char *s,int nn)
 53 {
 54     Trie *p=root;
 55     int i,k;
 56     for(i=0;s[i]&&i<41;i++)
 57     {
 58         k=s[i]-'0';
 59         if(p->next[k]==NULL)
 60         p->next[k]=build();
 61         p=p->next[k];
 62         if(p->count==-1)p->count=nn;
 63     }
 64 }
 65 bool search(char *s)
 66 {
 67     Trie *p=root;
 68     int i,k;
 69     for(i=0;s[i];i++)
 70     {
 71         k=s[i]-'0';
 72         if(p->next[k]==NULL)return false;
 73         else p=p->next[k];
 74     }
 75     ans=p->count;
 76     return true;
 77 }
 78 void init()
 79 {
 80      s1[0]='1';s1[1]='\0';
 81      s2[0]='1';s2[1]='\0';
 82      insert_node(s1,1);
 83      insert_node(s2,2);
 84     for(int i=3;i<=100000;i++)
 85      {
 86          int len1=strlen(s1),len2=strlen(s2);
 87          if(len2>60)
 88          {    
 89              s2[len2-1]='\0';
 90              s1[len1-1]='\0';
 91          }
 92         padd(s1,s2,s3);
 93         strcpy(s1,s2);
 94         strcpy(s2,s3);
 95          insert_node(s3,i);
 96      }
 97 }
 98 int main()
 99 {
100      int T,cas=1;
101      root=build();
102      init();
103      scanf("%d",&T);
104      while(T--)
105      {
106          scanf("%s",s);
107          bool flag=search(s);
108          printf("Case #%d: ",cas++);
109          if(!flag)puts("-1");
110          else printf("%d\n",ans-1);
111      }
112     return 0;
113 }
View Code

 

posted @ 2013-10-05 20:54  EtheGreat  阅读(247)  评论(0编辑  收藏  举报