矩阵快速幂

背景:众所周知矩阵快速幂可以用来求斐波那契数列QAQ

代码实现:

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,p;
struct jz            //jz意思为矩阵
{
  int a[101][101]; }jlgz,ans;      //开两个矩阵 jz operator *(jz a,jz b)//矩阵乘法重载运算符QWQ { jz c;          //c矩阵用来存答案的 for(int i=0;i<=1;i++)//i表示第i行 {for(int j=0;j<=1;j++)//j表示第j列
{c.a[i][j]
=0; for(int k=0;k<=1;k++) c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p; }  //矩阵乘法定义,%p在这里处理 return c;  //返回一次相乘得到的矩阵 } int main() { scanf("%d%d%d",&n,&m,&p);//求n阶矩阵的m次方mod p for(int i=0;i<n;i++) { for(int j=0;j<n;j++) scanf("%d",&jlgz.a[i][j]);  //jlgz为输入的n*n的矩阵 } int r=m; for(int i=0;i<n;i++) { ans.a[i][i]=1;  //对角阵,即单位矩阵 } while(r) //同数字的快速幂一个原理,这也为一个快速幂 {if(r&1)ans=ans*jlgz; jlgz=jlgz*jlgz; r/=2; } for(int i=0;i<n;i++)  //输出矩阵就可以了 {for(int j=0;j<n;j++) cout<<ans.a[i][j]<<" "; cout<<endl; } }

 

posted @ 2019-04-09 20:53  李白莘莘学子  阅读(299)  评论(0编辑  收藏  举报