矩阵快速幂

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Linfanty/article/details/79948658

首先把非线性递推式转换为线性递推式
∵ (n+1)4 = n4 + 4n3 + 6n2 + 4n + n0
∵ F(n+1) = F(n) + 2F(n-1) + (n+1)4
∴ F(n+1) = F(n) + 2F(n-1) + n4 + 4n3 + 6n2 + 4n + n0

然后我们看下下面的状态转移矩阵



作者:徐森威
链接:https://www.jianshu.com/p/25eba927d9da
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long  LL;
const int N = 2,M=2,P=2;
const int MOD=1000000007;
struct Matrix
{
    LL m[N][N];
};
Matrix A={1,1,
          1,0};
Matrix I={1,0,
          0,1};
Matrix multi(Matrix a,Matrix b)//矩阵乘法:a为N行P列的矩阵,b为P行M列的矩阵,二者相乘得到的矩阵为N行M列;
{
    Matrix ans;
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
        {
            ans.m[i][j]=0;
            for(int k=0;k<P;k++)
                ans.m[i][j]+=a.m[i][k]*b.m[k][j]%MOD;
            ans.m[i][j]%=MOD;
        }
    return ans;
}
Matrix power(Matrix a,int k)//由整数的快速幂运算的出的矩阵快速幂
{
    Matrix ans=I,p=a;
    while(k)
    {
        if(k&1)
        {
            ans=multi(ans,p);
        }
        k>>=1;
        p=multi(p,p);
    }
    return ans;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        Matrix ans=power(A,n-1);
        printf("%lld\n",ans.m[0][0]);
    }
    return 0;
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页