【luogu3390】【矩阵乘法】【快速幂】【模板】矩阵快速幂

传送门

题目背景

矩阵快速幂

题目描述

给定 n × n n\times n n×n 的矩阵 A A A,求 A k A^k Ak

输入格式

第一行两个整数 n , k n,k n,k 接下来 n n n 行,每行 n n n 个整数,第 i i i 行的第 j j j 的数表示 A i , j A_{i,j} Ai,j

输出格式

输出 A k A^k Ak
n n n 行,每行 n n n 个数,第 i i i 行第 j j j 个数表示 ( A k ) i , j (A^k)_{i,j} (Ak)i,j ,每个元素对 1 0 9 + 7 10^9+7 109+7 取模。

输入输出样例
输入 #1
2 1
1 1
1 1
输出 #1
1 1
1 1
说明/提示
【数据范围】

对于 100 % 100\% 100% 的数据: 1 ≤ n ≤ 100 1\le n \le 100 1n100 0 ≤ k ≤ 1 0 12 0 \le k \le 10^{12} 0k1012, ∣ A i , j ∣ ≤ 1000 |A_{i,j}| \le 1000 Ai,j1000


解题思路

没错我就是在水题而已……

详情请见矩阵乘法


Code

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const long long Mod = 1000000007;
struct DT{
    
    
	long long aed[110][110];
	long long n;
}A, B;
long long n, m;

DT operator *(DT a, DT b){
    
    
	DT c;
	memset (c.aed, 0, sizeof (c.aed));
	c.n = a.n;
	for (int k = 1; k <= c.n; k++)
		for (int i = 1; i <= a.n; i++)
			for (int j = 1; j <= b.n; j++)
				c.aed[i][j] = (c.aed[i][j] + a.aed[i][k] * b.aed[k][j] % Mod) % Mod;
	return c;
}

void power (long long x){
    
    
	if (x == 1)
	{
    
    
		B = A;
		return;
	}
	power (x / 2);
	B = B * B;
	if (x % 2)
		B = B * A;
}

int main(){
    
    
	scanf ("%lld%lld", &n, &m);
	A.n = n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf ("%lld", &A.aed[i][j]);
	power (m);
	for (int i = 1; i <= n; i++)
	{
    
    
		for (int j = 1; j <= n; j++)
			printf ("%lld ", B.aed[i][j]);
		printf ("\n");
	}
	printf("");
} 

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/111387138
今日推荐