首页 > 其他 > 详细

[HDU2855]Fibonacci Check-up

时间:2018-11-29 22:08:10      阅读:160      评论:0      收藏:0      [点我收藏+]

题目:Fibonacci Check-up

链接:

分析:

1)二项式展开:$(x+1)^n = \sum^n_{k=0}{C^k_n * x^k}$

2)Fibonacci数列可以写为:$ \left[ \begin{array}{cc} 0 & 1 \\ 1 & 1 \end{array} \right]^n$的左下角项。

3)构造矩阵。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
int MOD;
struct Matrix{
    LL a[2][2];
    void init(int f){
        memset(a,0,sizeof a);
        if(f==-1)return;
        for(int i=0;i<2;++i)a[i][i]=1;
    }
};
Matrix operator*(Matrix& A,Matrix& B){
    Matrix C;C.init(-1);
    for(int i=0;i<2;++i)
    for(int j=0;j<2;++j)
        for(int k=0;k<2;++k){
            C.a[i][j]+=A.a[i][k]*B.a[k][j];
            C.a[i][j]%=MOD;
        }
    return C;
}
Matrix operator^(Matrix A,int n){
    Matrix Rt;Rt.init(0);
    for(;n;n>>=1){
        if(n&1)Rt=Rt*A;
        A=A*A;
    }
    return Rt;
}
int main(){
    int n,Case;scanf("%d",&Case);
    Matrix A,T;
    T.a[0][0]=1;T.a[0][1]=1;
    T.a[1][0]=1;T.a[1][1]=2;

    for(;Case--;){
        scanf("%d%d",&n,&MOD);
        A=T^n;
        LL ans=A.a[1][0];
        printf("%lld\n",ans%MOD);
    }

    return 0;
}
        

 

[HDU2855]Fibonacci Check-up

原文:https://www.cnblogs.com/hjj1871984569/p/10041166.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!