问题描述
一个 m×n 的矩阵是一个由 m 行 n 列元素排列成的矩形阵列。即形如
给定一个 n⋅n 的矩阵 A,求解 Ak,每个元素需对 109+7 取模。
输入格式
第一行输入 2 个正整数 n,k。
接下来 n 行,每行 n 个正整数,表示矩阵的具体元素。
输出格式
输出 n 行,每行 n 个正整数,第 i 行第 j 个数表示 (Ak)i,j,每个元素对 109+7 取模。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
468 576 684
1062 1305 1548
1656 2034 2412
评测数据规模
1≤n≤100,0≤k≤1012,∣Aij∣≤1000。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 2s | 256M |
C | 2s | 256M |
Java | 3s | 256M |
Python3 | 4s | 256M |
PyPy3 | 4s | 256M |
Go | 4s | 256M |
JavaScript | 4s | 256M |
#include <iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const ll MAX = 1e2 +4;
const ll INF = 1e9;
const ll M = 1e9 + 7;
ll a[MAX][MAX];
ll b[MAX][MAX];
ll c[MAX][MAX];
void Cheng(ll n,ll m1[][MAX],ll m2[][MAX])
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
c[i][j] = 0;
for (int k = 1; k <= n; k++)
{
c[i][j] = (c[i][j]%M+(m1[i][k] * m2[k][j])%M)%M;
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
m1[i][j] = c[i][j];
}
}
}
void ksm(ll n, ll k)
{
while (k)
{
if (k & 1)
{
Cheng(n,b, a);
}
k >>= 1;
Cheng(n,a, a);
}
}
int main()
{
ll n, k;
cin >> n >> k;
for (int i = 1; i <= MAX - 1; i++)
{
for (int j = 1; j <= MAX - 1; j++)
{
if (i == j)
{
b[i][j] = 1;
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin>>a[i][j];
}
}
ksm(n,k);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cout<<b[i][j]<<" ";
}
cout << endl;
}
return 0;
}