hdu 3936 斐波那契数列+规律

来源:互联网 发布:url转码方法 java 编辑:程序博客网 时间:2024/04/28 15:30

 

原文链接:http://blog.csdn.net/jxy859/article/details/6686305

 

Fibonacci数列通项公式∴F(n)=(1/√5)*{[(1+√5)/2]^(n+1) - [(1-√5)/2]^(n+1)}

性质:

[plain] view plaincopyprint?
  1.   1.f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1。   
  2.   
  3.   2.f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)。   
  4.   
  5.   3.f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1。   
  6.   
  7.   4.[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)。   
  8.   
  9.   5.f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1。   
  10.   
  11.   6.f(m+n-1)=f(m-1)·f(n-1)+f(m)·f(n)。   
  12.   
  13.         利用这一点,可以用程序编出时间复杂度仅为O(log n)的程序。   
  14.   
  15.   7.[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)。   
  16.   
  17.   8.f(2n-1)=[f(n)]^2-[f(n-2)]^2。   
  18.   
  19.   9.3f(n)=f(n+2)+f(n-2)。   
  20.   
  21.   10.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]   
  22.   
  23.     11.f(2n+1)=[f(n)]^2+[f(n+1)]^2.  
[plain] view plaincopyprint?
  1. <H3 class="headline-2 bk-sidecatalog-title"><A name=t0></A><A name=2_2></A><SPAN class=headline-content>斐波那契数列的整除性与素数生成性</SPAN></H3>  每3个数有且只有一个被2整除, <DIV class=spctrl></DIV>  每4个数有且只有一个被3整除, <DIV class=spctrl></DIV>  每5个数有且只有一个被5整除, <DIV class=spctrl></DIV>  每6个数有且只有一个被8整除, <DIV class=spctrl></DIV>  每7个数有且只有一个被13整除, <DIV class=spctrl></DIV>  每8个数有且只有一个被21整除, <DIV class=spctrl></DIV>  每9个数有且只有一个被34整除, <DIV class=spctrl></DIV>  ....... <DIV class=spctrl></DIV>  我们看到第5、7、11、13、17、23位分别是素数:5,13,89,233,1597,28657(第19位不是)   
[plain] view plaincopyprint?
  1. <H3 class="headline-2 bk-sidecatalog-title"><A name=t1></A><A name=2_3></A><SPAN class=headline-content>斐波那契数列的个位数:一个60步的循环</SPAN></H3>  11235,83145,94370,77415,61785.38190, <DIV class=spctrl></DIV>  99875,27965,16730,33695,49325,72910…  

本题题意:

本题可以利用性质4 和 6

 定义sum[i]=sigma(p[j]) 1<=j<=i .

有p[i]=f[2*i-1]^2+f[2*i]^2.

则由公式4可知sum[i]=f[2*i]*f[2*i+1].

之后直接求得sum[r]-sum[l-1]即可。

这是我第一次矩阵连乘 用的是预处理f[2^n].

HDU 跑了78ms 第11 估计前10个跑62的 都是贴的同一个模板吧  

[cpp] view plaincopyprint?
  1. #include <cstdio>   
  2. #include <cstring>   
  3.   
  4. typedef long long ll;  
  5. const ll mod=1000000007;  
  6. ll mtrx[60][2][2];  
  7.   
  8. void debug (ll a[][2])  
  9. {  
  10.     printf("%lld  %lld\n%lld  %lld\n",a[0][0],a[0][1],a[1][0],a[1][1]);  
  11. }  
  12.   
  13. void pre_pro()  
  14. {  
  15.     memset (mtrx , 0 , sizeof(mtrx));  
  16.     mtrx[0][0][0]=1;mtrx[0][0][1]=1;  
  17.     mtrx[0][1][0]=1;mtrx[0][1][1]=0;  
  18.     for (int t=0 ; t<60 ; ++t)  
  19.        for (int i=0 ; i<2 ; ++i)  
  20.          for (int j=0 ; j<2 ; ++j)  
  21.          {  
  22.              for (int k=0 ; k<2 ; ++k)  
  23.               mtrx[t+1][i][j]+=mtrx[t][i][k]*mtrx[t][k][j];  
  24.             mtrx[t+1][i][j]%=mod;  
  25.          }  
  26. }  
  27.   
  28. ll fib (ll a)  
  29. {  
  30.     a--;  
  31.     ll mat[2][2]={1,0,0,1};  
  32.     ll tmp[2][2];  
  33.     for (int p=0 ; a ; a>>=1 , ++p)  
  34.     {  
  35.         if(!(a&1))continue;  
  36.         tmp[0][0]=mat[0][0];tmp[0][1]=mat[0][1];  
  37.         tmp[1][0]=mat[1][0];tmp[1][1]=mat[1][1];  
  38.         memset (mat, 0 , sizeof(mat));  
  39.         for (int i=0 ; i<2 ; ++i)  
  40.          for (int j=0 ; j<2 ; ++j)  
  41.          {  
  42.              for (int k=0 ; k<2 ; ++k)  
  43.                  mat[i][j]+=mtrx[p][i][k]*tmp[k][j];  
  44.              mat[i][j]%=mod;  
  45.          }  
  46.     }  
  47.     //debug (mat);   
  48.     return mat[0][0];  
  49. }  
  50.   
  51. ll sum(ll a)  
  52. {  
  53.     if(a==0)return 0;  
  54.     else return fib(2*a)*fib(2*a+1)%mod;  
  55. }  
  56.   
  57. int main ()  
  58. {  
  59.     pre_pro();  
  60.     int cas;  
  61.     //freopen ("in.in","r",stdin);  
  62.     //freopen ("out.txt","w",stdout);   
  63.     //for (int i=0 ; i<20 ; ++i) debug(mtrx[i]);  
  64.     scanf("%d",&cas);  
  65.     while (cas--)  
  66.     {  
  67.         ll l,r;  
  68.         scanf("%I64d%I64d",&l,&r);  
  69.         printf("%d\n",(sum(r)-sum(l-1)+mod)%mod);  
  70.     }  
  71.     return 0;  
  72. }