题目背景
矩阵快速幂
题目描述
给定 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 1≤n≤100, 0 ≤ k ≤ 1 0 12 0 \le k \le 10^{12} 0≤k≤1012, ∣ A i , j ∣ ≤ 1000 |A_{i,j}| \le 1000 ∣Ai,j∣≤1000
解题思路
没错我就是在水题而已……
详情请见矩阵乘法
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("");
}