[数据结构与算法-09]矩阵快速幂
矩阵快速幂
为什么要写矩阵快速幂呢,因为快速幂我已经写过了,只要重载一下运算符就好了(一个字:懒),绝对不是我懒啊。
运算符重载
struct Matrix {
	long long e[101][101];
};
// 此处传reference
Matrix operator* (const Matrix& x, const Matrix& y) {
	Matrix r;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			r.e[i][j] = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 1; k <= n; k++) {
				r.e[i][j] += x.e[i][k] * y.e[k][j] % Mod;
				r.e[i][j] %= Mod;
			}
	return r;
}
P3390 【模板】矩阵快速幂
题目背景
矩阵快速幂
题目描述
给定 n\times nn×n 的矩阵 AA,求 A^kA**k。
输入格式
第一行两个整数 n,kn,k 接下来 nn 行,每行 nn 个整数,第 ii 行的第 jj 的数表示 A_{i,j}A**i,j。
输出格式
输出 A^kA**k
共 nn 行,每行 nn 个数,第 ii 行第 jj 个数表示 (A^k)_{i,j}(A**k)i,j,每个元素对 10^9+7109+7 取模。
输入输出样例
输入 #1复制
2 1 1 1 1 1输出 #1复制
1 1 1 1说明/提示
【数据范围】
对于 100%100% 的数据:1\le n \le 1001≤n≤100,0 \le k \le 10^{12}0≤k≤1012, |A_{i,j}| \le 1000∣A**i,j∣≤1000
完整解答
#include <cstdio>
#define Mod 1000000007
struct Matrix {
	long long e[101][101];
}A, ans;
long long n, k;
Matrix operator* (const Matrix& x, const Matrix& y) {
	Matrix r;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			r.e[i][j] = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 1; k <= n; k++) {
				r.e[i][j] += x.e[i][k] * y.e[k][j] % Mod;
				r.e[i][j] %= Mod;
			}
	return r;
}
int main() {
	scanf("%lld%lld", &n, &k);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf("%lld", &A.e[i][j]);
        // 之前的1用单位矩阵代替
	for (int i = 1; i <= n; i++)
		ans.e[i][i] = 1;
        // 普通快速幂
	while (k) {
		if (k & 1)ans = ans * A;
		A = A * A;
		k = k >> 1;
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++)
			printf("%lld ", ans.e[i][j]);
		printf("\n");
	}
	return 0;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号