zoukankan      html  css  js  c++  java
  • 矩阵快速幂及斐波那契数列模板

    本篇博客先给出矩阵快速幂以及利用矩阵快速幂求斐波那契数列的模板,讲解待更新…… 

    const int N=10;
    int tmp[N][N];
    void multi(int a[][N],int b[][N],int n)
    {
        memset(tmp,0,sizeof tmp);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            for(int k=0;k<n;k++)
            tmp[i][j]+=a[i][k]*b[k][j];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            a[i][j]=tmp[i][j];
    }
    int res[N][N];
    void Pow(int a[][N],int n)
    {
        memset(res,0,sizeof res);//n是幂,N是矩阵大小
        for(int i=0;i<N;i++) res[i][i]=1;
        while(n)
        {
            if(n&1)
                multi(res,a,N);//res=res*a;复制直接在multi里面实现了;
            multi(a,a,N);//a=a*a
            n>>=1;
        }
    }
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2;
    const int MOD=1000000009;
    struct mat
    {
        ll a[N][N];
    };
    mat mat_mul(mat x,mat y)
    {
        mat res;
        memset(res.a,0,sizeof(res.a));
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
            for(int k=0;k<2;k++)
            res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%MOD;
        return res;
    }
    void mat_pow(ll n)
    {
        mat c,res;
        c.a[0][0]=c.a[0][1]=c.a[1][0]=1;
        c.a[1][1]=0;
        memset(res.a,0,sizeof(res.a));
        for(int i=0;i<2;i++) res.a[i][i]=1;
        while(n)
        {
            if(n&1) res=mat_mul(res,c);
            c=mat_mul(c,c);
            n=n>>1;
        }
        printf("%I64d
    ",res.a[0][1]);
    }
    int main()
    {
        ll n;
        scanf("%lld",&n);
        mat_pow(n);
        return 0;
    }
  • 相关阅读:
    (转)重识new
    【洛谷习题】连续自然数和
    【AHOI2005】约数研究
    【NOIP2003】麦森数
    康托展开
    【洛谷习题】南蛮图腾
    【洛谷习题】吃奶酪
    【NOIP2002】字串变换
    哈希表
    【NOIP2013】货车运输
  • 原文地址:https://www.cnblogs.com/aerer/p/9930934.html
Copyright © 2011-2022 走看看