矩阵快速幂
背景:众所周知矩阵快速幂可以用来求斐波那契数列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; } }