码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU2855]Fibonacci Check-up

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

标签:print   sizeof   cstring   typedef   \n   ++   namespace   题目   div   

题目: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

标签:print   sizeof   cstring   typedef   \n   ++   namespace   题目   div   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!