#include <stdio.h>
#include <memory.h>
#define MAX_SIZE 100
void divide(int(*a)[MAX_SIZE], int n, int p);
void mul(int(*a)[MAX_SIZE], int(*b)[MAX_SIZE], int n);
int m[MAX_SIZE][MAX_SIZE];
int temp[MAX_SIZE][MAX_SIZE];
int temp1[MAX_SIZE][MAX_SIZE];
int main(void)
{
int C, N[100], p;
int i, j, k;
int t[20][MAX_SIZE][MAX_SIZE];
scanf("%d", &C);
for (k = 0; k < C; k++){
scanf("%d %d", &N[k], &p);
for (i = 0; i < N[k]; i++)
for (j = 0; j < N[k]; j++){
scanf("%d", &m[i][j]);
}
memcpy(temp1, m, sizeof(temp1));
divide(m, N[k], p);
memcpy(t[k], m, sizeof(t[k]));
}
for (k = 0; k < C; k++)
for (i = 0; i < N[k]; i++){
for (j = 0; j < N[k]; j++)
printf("%d ", t[k][i][j]);
printf("\n");
}
return 0;
}
void mul(int (*a)[MAX_SIZE], int (*b)[MAX_SIZE], int n)
{
int i, j, k, t=0;
for (j = 0; j < n; j++){
for (i = 0; i < n; i++){
for (k = 0; k < n; k++){
t += (a[j][k] * b[k][i]);
}
temp[j][i] = t % 10007;
t = 0;
}
}
memcpy(a, temp, sizeof(temp));
}
void divide(int (*a)[MAX_SIZE], int n, int p)
{
if (p == 1) return;
if (p == 2){
mul(a, a, n);
return;
}
if (p & 0x00000001){
divide(a, n, (p)>>1);
mul(a, a, n);
mul(a, temp1, n);
}
else{
divide(a, n, p>>1);
mul(a, a, n);
}
}
ycs1008
아래는 소스코드 입니다.
11년 전