斐波拉契数列矩阵连乘(模板)

来源:互联网 发布:linq 更新数据 编辑:程序博客网 时间:2024/05/18 10:43

题意:求第N项取模1e9+7。

思路:


# include <bits/stdc++.h>using namespace std;typedef long long LL;const LL mod = 1e9+7;struct Mat{LL mat[2][2];};Mat operator *(Mat a, Mat b)//矩阵相乘。{    Mat c;    for(int i=0; i<2; ++i)        for(int j=0; j<2; ++j)        {            c.mat[i][j] = 0;            for(int k=0; k<2; ++k)                c.mat[i][j] = (c.mat[i][j] + a.mat[i][k]*b.mat[k][j]%mod)%mod;        }    return c;}Mat operator ^(Mat a, LL k){    Mat c;    for(int i=0; i<2; ++i)//普通快速幂初始化为1,这里初始化为单位矩阵。        for(int j=0; j<2; ++j)        c.mat[i][j] = (i==j);    for(;k;k>>=1)//快速幂。    {        if(k&1) c = c*a;        a = a*a;    }    return c;}int main(){    int n;    while(~scanf("%d",&n))    {        Mat c;        c.mat[0][0] = c.mat[0][1] = c.mat[1][0] = 1;        c.mat[1][1] = 0;        c = c^n;        printf("%lld\n",c.mat[1][0]);    }    return 0;}


原创粉丝点击