矩阵快速幂 模板

标签: 数论
5人阅读 评论(0) 收藏 举报
分类:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=110;
const int  mod=1e9+7;
//#define Mod(x) ((x)%mod)
typedef long long ll;
struct node
{
    int a[maxn][maxn];
} unit;//单位矩阵
ll Mod(ll sum)
{
    return sum%(ll)mod;
}
node Init(node a)//初始化一个矩阵为单位矩阵
{
    for(int i=0; i<maxn; i++)
        for(int j=0; j<maxn; j++)
            if(i==j)
                a.a[i][j]=1;
            else
                a.a[i][j]=0;
    return a;
}
node Mult(int n,node q,node p)//矩阵乘法 也可重载 "*" 运算符
{
    node t;
    ll x;
    for(int i=0; i<n; i++)
    for(int  j=0; j<n; j++)
    {
         x=0;
        for(int k=0; k<n; k++)
        {
            x+=Mod((ll)q.a[i][k]*p.a[k][j]);
        }
        t.a[i][j]=Mod(x);
    }


    return t;
}
node Pow(int n,int m,node a)//快速幂的基本操作
{
    node ret=unit;
    while(m!=0)
    {
        if(m&1)
            ret=Mult(n,ret,a);
        a=Mult(n,a,a);
        m=m>>1;


    }
    return ret;
}
//10的2进制为1010 10=2^1+2^3; a^10=a^(2^3)*a^(2^1) 有没有发现前一个始终是后一个的a^x倍 于是每一次计算完a过后执行a*a操作 
//然后每次分解10的2进制为如果是1也就是&1为真的话执行就把结果乘起来。
int main()
{
    int n,m;
    cin>>n>>m;
    node a;
    unit=Init(unit);
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin>>a.a[i][j];
    a=Pow(n,m,a);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(j==n-1)
                printf("%d\n",a.a[i][j]);
            else
                printf("%d ",a.a[i][j]);
        }
    }
    return 0;
}
查看评论

一个我自己写的矩阵快速幂模板

矩阵快速幂模板
  • SHU_onisac
  • SHU_onisac
  • 2015-09-03 22:40:27
  • 549

矩阵快速幂(模板+例题)

模板#include #include//pow函数,其实没啥用 using namespace std;int n;long long k; const int N=pow(10,9)+7; st...
  • amourww
  • amourww
  • 2017-02-24 11:12:38
  • 487

poj 3070 Fibonacci(矩阵快速幂模板,斐波那契)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12812   Acc...
  • acm_cxq
  • acm_cxq
  • 2016-07-18 17:35:18
  • 501

矩阵快速幂模版

#define Matr 105 //矩阵大小 struct mat//矩阵结构体,a表示内容,size大小 { int a[105][105],size; mat() {...
  • qq574857122
  • qq574857122
  • 2013-08-18 09:09:48
  • 3060

*矩阵快速幂(斐波那契数列模板)

今天是2017/5/31,DCDCBigBig的第十七篇博文 矩阵快速幂#include #include #include #include using namespace std; typedef...
  • DCDCBigBig
  • DCDCBigBig
  • 2017-05-31 21:36:54
  • 266

矩阵快速幂模板篇

矩阵快速幂(模板)
  • u012860063
  • u012860063
  • 2014-06-21 20:25:42
  • 1204

POJ 3070 矩阵快速幂求斐波那契数列

poj  3070    这个代码是从网上找到的,但是感觉特别适用,尽管现在有几个地方我还不是特别理解,所以先贴进来,以后慢慢懂。 # include #include # define M...
  • u011041349
  • u011041349
  • 2013-11-06 18:25:10
  • 560

【公式+矩阵快速幂】HDU_3117 Fibonacci Numbers

Fibonacci Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other...
  • yiluuuuu
  • yiluuuuu
  • 2017-06-15 18:10:53
  • 109

矩阵快速幂,求斐波那契数列

用矩阵的快速幂求斐波那契数列,时间复杂度为O(lgn*n^3),其中计算一次矩阵相乘复杂度为O(n^3),大大缩小了暴力相乘(1次1次乘)的时间复杂度 参考文章:   ...
  • fhb1922702569
  • fhb1922702569
  • 2017-09-10 10:38:44
  • 127

51nod 巨大的斐波那契数列(矩阵快速幂),递推式优化的好模板!!!!!!!

斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34...
  • h1021456873
  • h1021456873
  • 2015-10-24 16:12:20
  • 1018
    个人资料
    等级:
    访问量: 279
    积分: 37
    排名: 191万+
    文章存档
    最新评论