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 }