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;
    }
  • 相关阅读:
    装饰器
    深浅拷贝
    dm-开发知识片段积累
    java开发-SDE配置
    一、数据库介绍
    oracle学习 知识点目录
    五、Java SE核心II
    三、面向对象
    四、Java SE核心I
    二、Java语言基础
  • 原文地址:https://www.cnblogs.com/aerer/p/9930934.html
Copyright © 2011-2022 走看看