hdu 2855 Fibonacci Check-up 矩阵+斐波那契通项公式

来源:互联网 发布:mysql存储过程的数组 编辑:程序博客网 时间:2024/06/04 19:08
#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>#include <iostream>using namespace std;#define LL __int64int mod;struct matrix{    int f[2][2];};matrix mul(matrix a,matrix b){    matrix c;    int i,j,k;    memset(c.f,0,sizeof(c.f));    for(k=0;k<2;k++)    {        for(i=0;i<2;i++)        {            if(!a.f[i][k])continue;            for(j=0;j<2;j++)            {                if(!b.f[k][j])continue;                c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod;            }        }    }    return c;}matrix pow_mod(matrix a,int b){    matrix s;    memset(s.f,0,sizeof(s.f));    for(int i=0;i<2;i++)        s.f[i][i]=1;    while(b)    {        if(b&1)            s=mul(s,a);        a=mul(a,a);        b=b>>1;    }    return s;}int main(){    int T;    cin>>T;    while(T--)    {        int n;        cin>>n>>mod;        if(n==0){cout<<0<<endl;continue;}        n=n*2;        matrix e;        e.f[0][0]=e.f[0][1]=e.f[1][0]=1;e.f[1][1]=0;        e=pow_mod(e,n);        cout<<e.f[0][1]<<endl;    }    return 0;}/*    矩阵:    斐波那契数列    f[n]=f[n-1]+f[n-2];    |f[n+1] f[n]|=|f[n] f[n-1]|*|1 1|                                |1 0|     方法:     通项公式:f[n]=(1/sqrt(5))*(((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n)     二项式:(1+a)^n=∑(C(n,k)*a^k)(0<=k<=n)          ∑C(n,k)*f[k]     =(1/sqrt(5))*∑C(n,k)*(((1+sqrt(5))/2)^k-((1-sqrt(5))/2)^k)     =(1/sqrt(5))*(∑C(n,k)*((1+sqrt(5))/2)^k-∑C(n,k)*((1-sqrt(5))/2)^k)     =(1/sqrt(5))*((3+sqrt(5))/2)^n-((3-sqrt(5))/2)^n)     =(1/sqrt(5))*((1+sqrt(5))/2)^(2*n)-((1-sqrt(5))/2)^(2*n))     =f[2*n]         还可化开下。     又g[n]=∑C(n,k)*f[k];     g[n]=[2*n]=f[2*n-1]+f[2*n-2]=2*f[2*n-2]+f[2*n-3]=3*f[2*n-2]-f[2*n-2]+f[2*n-3]                =3*f[2*n-2]-f[2*n-4]=3*g[n-1]-g[n-2];    矩阵:        |g[n+1] g[n]|=|g[n] g[n-1]|*| 3 1|(g[0]=0,g[1]=3)                                    |-1 0|    结果:0 1 3 8 21 55...如果你思维够活跃,也可以直接看出来g[n]=3*g[n-1]-g[n-2]的吧。。*/

Fibonacci Check-up


原创粉丝点击