1. 程式人生 > >一個我自己寫的矩陣快速冪模板

一個我自己寫的矩陣快速冪模板

/* 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;
}