/* n阶方形矩阵快速幂模板,如果m*n的矩阵可以考虑将m,n存入结构体matrix中
函数分为3个,分别是矩阵相乘,转化单位矩阵,快速幂。
测试结果 AC
BY SHU_ONISAC */
#include<iostream>
#include<cstring>
using namespace std;
struct matrix{
long long a[15][15];
};
matrix matrix_muti(matrix a,matrix b,int n)//矩阵相乘(这个只要注意i,j,k的顺序就行了)
{
matrix c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
for(int k=0;k<n;++k){
c.a[i][j]+=a.a[i][k]*b.a[k][j];
}
return c;
}
matrix init(matrix r,int n)//转化单位矩阵
{
for(int i=0;i<n;++i){
for(int j=0;j<n;++j)
r.a[i][j]=(i==j);
}
return r;
}
matrix fast_power(matrix a,int n,int k)//快速幂
{ matrix r;
r=init(r,n);//先将r.a化为单位矩阵
while(k){
if(k&1)r=matrix_muti(r,a,n);
/*(k&1)与(k&2==1)是一个意思,就是矩阵相乘的时候如果幂次不是偶数,
要提出一个“因数”存在r内。又因为无论 k是奇数或者偶数,由于k=k>>1(相当于k=k/2),
k最终一定会先变为1再变为0,所以最终结果可以存在r中。*/
a=matrix_muti(a,a,n);
k=k>>1;
}
return r;
}
int main()
{ int n,k;
matrix ori,ans;
while(cin>>n>>k)
{
for(int i=0;i<n;++i)//将输入的数据存在ori中
for(int j=0;j<n;++j)
cin>>ori.a[i][j];
ans=fast_power(ori,n,k);//运行快速幂
for(int i=0;i<n;++i)//输出结果
{
for(int j=0;j<n;++j)
{ if(j<n-1)cout<<ans.a[i][j]<<' ';
else cout<<ans.a[i][j];
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
一个我自己写的矩阵快速幂模板
最新推荐文章于 2024-10-24 19:05:02 发布