hdu1568 hdu4099 斐波那契

斐波那契史:

①     求斐波那契数的后四位,矩阵乘法+快速幂。

②     求斐波那契数的前四位(n<100000000),用到斐波那契数的公式(Hdu1568)。

③     求斐波那契数的前40位(n<100000)(Hdu4099)。

④     求斐波那契“串”的某一位(百度之星)……

斐波那契数公式:

①矩阵+快速幂

②hdu1568

  先看对数的性质

  loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);
  Eg:

  log10(10234432)= log10(1.0234432*10^7)= log10(1.0234432)+7;
  log10(1.0234432)就是log10(10234432)的小数项目组.
  log10(1.0234432)= 0.010063744
  10^0.010063744=1.023443198
  那么要取几位就很明显了吧~
  先取对数(对10取),然后获得成果的小数项目组bit,pow(10.0,bit)今后若是答案还是小于1000那么就一向乘10。
  这题要用到斐波那契数列的公式: f[n]=

  取完对数:

  其中aa =(sqrt(5.0)+1.0)/2.0;

  因为  趋近于0

  所以可以写成log10(an)=-0.5*log10(5.0)+((double)n)*log(f)/log(10.0);

  最后取其小数项目组。

View Code
 1 #include <stdio.h>
 2 #include <math.h>
 3 #define aa (sqrt(5.0)+1.0)/2
 4 int main()
 5 {
 6     int i,n,Fibonacci[40]={0,1,1,2,3,5};
 7     double ans;
 8     for(i=6;i<40;i++)
 9         Fibonacci[i] = Fibonacci[i-1]+Fibonacci[i-2];
10     while(scanf("%d",&n)!=EOF)
11     {
12         if(n<40){
13             int a=Fibonacci[n];
14             while(a>10000){
15                 a=a/10;
16             }
17             printf("%d\n",a);
18         }
19         else
20         {
21             ans=-0.5*(log10(5.0))+n*log10(aa);
22             ans-=(int)ans;
23             ans=pow(10.0,ans);
24             while(ans<1000)
25                 ans*=10;
26             printf("%d\n",(int)ans);
27         }
28     }
29     return 0;
30 }

③斐波那契+字典树???

④废话:

  好不容易写一次百度之星的题,愣是没给评判结果,说是没评判结果的都是编译错误,T.T因为只有一次提交机会,所

  以编译运行测试了无数遍才提交的,很多大牛也都没评判结果,后来几周的百度之星因为期末考试结果都被遗忘了T.T~

    百度之星的斐波那契字符串,就是找循环节,因为总共100种结果,打表后发现只有两种循环节,而循环节是1149的

  也只有几种情况,所以我是直接分情况判断的,代码写的很暴力。

  最一开始接触acm就是斐波那契,当6.5给我说矩阵乘法和公式法求斐波那契数的时候我才意识到斐波那契数是那么神奇~~  

posted @ 2013-01-11 17:09  _sunshine  阅读(813)  评论(0编辑  收藏  举报