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

来源:互联网 发布:ubuntu trusty xenial 编辑:程序博客网 时间:2024/05/17 05:57
/* 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;}

0 0
原创粉丝点击