51nod 1113 矩阵快速幂( 矩阵快速幂经典模板 )

1113 矩阵快速幂


链接:传送门

思路:经典矩阵快速幂,模板题,经典矩阵快速幂模板。


/*************************************************************************
    > File Name: 51nod1113.cpp
    > Author:    WArobot 
    > Blog:      http://www.cnblogs.com/WArobot/ 
    > Created Time: 2017年05月01日 星期一 23时14分35秒
 ************************************************************************/

#include<bits/stdc++.h>
using namespace std;

const int maxn = 110;
const int MOD  = 1e9 + 7;
#define mod(x) ((x)%MOD)
#define ll long long 
struct mat{
	int m[maxn][maxn];
}unit;

int n;
// 重载*使之能进行矩阵乘法运算
mat operator * (mat a,mat b){
	mat ret;
	ll x;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			x = 0;
			for(int k=0;k<n;k++)
				x += mod( (ll)a.m[i][k]*b.m[k][j] );
			ret.m[i][j] = mod(x);
		}
	}
	return ret;
}
// 初始化单位矩阵unit
void init_unit(){
	for(int i=0;i<maxn;i++)
		unit.m[i][i] = 1;
}
// 计算矩阵a的x次幂
// 与普通快速幂原理相同
mat pow_mat(mat a,ll x){
	mat ret = unit;
	while(x){
		if(x&1)	ret = ret*a;
		a = a*a;
		x >>= 1;
	}
	return ret;
}

int main(){
	ll m;
	init_unit();
	while(~scanf("%d%lld",&n,&m)){
		mat a;
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				scanf("%d",&a.m[i][j]);
		a = pow_mat(a,m);
		for(int i=0;i<n;i++){
			printf("%d",a.m[i][0]);
			for(int j=1;j<n;j++)
				printf(" %d",a.m[i][j]);
			printf("\n");
		}
	}
	return 0;
}
posted @ 2017-05-01 23:37  ojnQ  阅读(239)  评论(0编辑  收藏  举报