문제
링크
풀이
#include <stdio.h>
int matrix[40][5][5];
int result[5][5];
int floorLogTwo(long long b) {
int pow = 0;
while (b > 0) {
b /= 2;
pow++;
}
return pow-1;
}
long long powTwo(int pow) {
long long res = 1;
for (int i=0; i<pow; i++) {
res *= 2;
}
return res;
}
void matmul(int n, int a[5][5], int b[5][5], int c[5][5]) {
int tmp[5][5];
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
tmp[i][j] = 0;
for (int k=0; k<n; k++) {
tmp[i][j] += a[i][k] * b[k][j];
}
tmp[i][j] %= 1000;
}
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
c[i][j] = tmp[i][j];
}
}
}
int main(void) {
int n, pow;
long long b;
scanf("%d %lld", &n, &b);
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
scanf("%d", &matrix[0][i][j]);
result[i][j] = matrix[0][i][j];
}
}
b--;
for (int i=0; i<floorLogTwo(b)+1; i++) {
matmul(n, matrix[i], matrix[i], matrix[i+1]);
}
while (b > 0) {
pow = floorLogTwo(b);
matmul(n, matrix[pow], result, result);
b -= powTwo(pow);
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("%d ", result[i][j]%1000);
}
printf("\n");
}
return 0;
}