多校第十場 HDU 3936 FIB Query(fibonacci 數列的性質 ,及Ologn 矩陣加速乘演算法)

來源:互聯網
上載者:User

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

性質:

  1.f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1。   2.f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)。   3.f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1。   4.[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)。   5.f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1。   6.f(m+n-1)=f(m-1)·f(n-1)+f(m)·f(n)。         利用這一點,可以用程式編出時間複雜度僅為O(log n)的程式。   7.[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)。   8.f(2n-1)=[f(n)]^2-[f(n-2)]^2。   9.3f(n)=f(n+2)+f(n-2)。   10.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]     11.f(2n+1)=[f(n)]^2+[f(n+1)]^2.
斐波那契數列的整除性與素數產生性  每3個數有且只有一個被2整除,   每4個數有且只有一個被3整除,   每5個數有且只有一個被5整除,   每6個數有且只有一個被8整除,   每7個數有且只有一個被13整除,   每8個數有且只有一個被21整除,   每9個數有且只有一個被34整除,   .......   我們看到第5、7、11、13、17、23位分別是素數:5,13,89,233,1597,28657(第19位不是) 
斐波那契數列的個位元:一個60步的迴圈  11235,83145,94370,77415,61785.38190,   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的 都是貼的同一個模板吧  

#include <cstdio>#include <cstring>typedef long long ll;const ll mod=1000000007;ll mtrx[60][2][2];void debug (ll a[][2]){    printf("%lld  %lld\n%lld  %lld\n",a[0][0],a[0][1],a[1][0],a[1][1]);}void pre_pro(){    memset (mtrx , 0 , sizeof(mtrx));    mtrx[0][0][0]=1;mtrx[0][0][1]=1;    mtrx[0][1][0]=1;mtrx[0][1][1]=0;    for (int t=0 ; t<60 ; ++t)       for (int i=0 ; i<2 ; ++i)         for (int j=0 ; j<2 ; ++j)         {             for (int k=0 ; k<2 ; ++k)              mtrx[t+1][i][j]+=mtrx[t][i][k]*mtrx[t][k][j];            mtrx[t+1][i][j]%=mod;         }}ll fib (ll a){    a--;    ll mat[2][2]={1,0,0,1};    ll tmp[2][2];    for (int p=0 ; a ; a>>=1 , ++p)    {        if(!(a&1))continue;        tmp[0][0]=mat[0][0];tmp[0][1]=mat[0][1];        tmp[1][0]=mat[1][0];tmp[1][1]=mat[1][1];        memset (mat, 0 , sizeof(mat));        for (int i=0 ; i<2 ; ++i)         for (int j=0 ; j<2 ; ++j)         {             for (int k=0 ; k<2 ; ++k)                 mat[i][j]+=mtrx[p][i][k]*tmp[k][j];             mat[i][j]%=mod;         }    }    //debug (mat);    return mat[0][0];}ll sum(ll a){    if(a==0)return 0;    else return fib(2*a)*fib(2*a+1)%mod;}int main (){    pre_pro();    int cas;    //freopen ("in.in","r",stdin);    //freopen ("out.txt","w",stdout);    //for (int i=0 ; i<20 ; ++i) debug(mtrx[i]);    scanf("%d",&cas);    while (cas--)    {        ll l,r;        scanf("%I64d%I64d",&l,&r);        printf("%d\n",(sum(r)-sum(l-1)+mod)%mod);    }    return 0;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.