矩阵快速幂的板子——注释翻译了一遍板子

版权声明:禁止copy抄袭,博主很凶的哦,超级凶的那种哦。 https://blog.csdn.net/Strawberry_595/article/details/81215821

日常存一下板子:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>

using namespace std;
const int  maxn = 50;
const int mod = 1e9 + 7;

int n, k;

struct Matrix
{
	int m[maxn][maxn];
};
Matrix operator * (Matrix a, Matrix b)
{
	Matrix c;
	memset(c.m, 0,sizeof(c.m));
	for(int i = 1;i <= n;i++){  //row
		for(int j = 1;j <= n;j++){  //col
			for(int k = 1;k <= n;k++){
				c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j] + mod) % mod;
			}
		}
	}
	return c;
}
Matrix operator ^ (Matrix a, int y)   //传入a矩阵 ,y次幂
{
	Matrix c;                      //c为结果矩阵
	memset(c.m , 0, sizeof(c.m));   
	for(int i = 1;i <= n;i++)
		c.m[i][i]  = 1;   //初始化

	while(y > 0){
		if(y & 1) c = c * a;    //你当做正常快速幂理解就行   矩阵相乘往上Matrix operator *;
		a = a * a;
		y = y >> 1;
	}
	return c;
}

Matrix r , tmp;

int main()
{
	while(scanf("%d %d",&n,&k) != EOF)    //n * n的矩阵,矩阵k次幂;
	{
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= n;j++)
				scanf("%d",&r.m[i][j]);   //输入矩阵
		tmp = r ^ k;     //实行r矩阵的k次幂 ,往上Matrix operator ^;
		for(int i = 1;i <= n;i++){
			for(int j = 1;j <= n;j++){
				printf("%d " ,tmp.m[i][i]);   //输出结果
			}
			printf("\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Strawberry_595/article/details/81215821