zoukankan      html  css  js  c++  java
  • 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]='';
     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]='';
     81      s2[0]='1';s2[1]='';
     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]='';
     90              s1[len1-1]='';
     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
    ",ans-1);
    111      }
    112     return 0;
    113 }
    View Code
  • 相关阅读:
    【selenium学习 -15】selenium授权auth弹窗登录
    【selenium学习 -14】selenium禁用网站图片
    【selenium学习 -13】selenium中的三种等待方式
    【selenium学习 -12】selenium操作web页面滚动条
    【selenium学习 -11】对浏览器窗口进行截屏
    【selenium学习 -10】alter,prompt,confirm弹窗的处理
    【selenium学习 -9】iframe的切换
    【selenium学习 -8】handle的切换
    【selenium学习 -7】selenium操作下拉菜单
    为什么Java只有值传递
  • 原文地址:https://www.cnblogs.com/i-love-acm/p/3352838.html
Copyright © 2011-2022 走看看