PS/Baekjoon Online Judge

[백준 10830] 행렬 제곱 [C]

kimyoungrok 2021. 8. 21. 03:41

백준 - 10830


풀이

분할 정복을 이용한 거듭제곱 알고리즘으로 행렬의 제곱을 구현해주어야 시간 초과가 발생하지 않는다.


소스코드

#include <stdio.h>
int N;
void square(int result[][5], int matrix[][5]){
    int temp[5][5] = {0,};
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            for (int k = 0; k < N; k++)
                temp[i][j] += (result[i][k]*matrix[k][j]) %1000;

    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            result[i][j] = temp[i][j] %1000;	
}
int main(){
    long long B;
    scanf("%d %lld", &N, &B);
    int matrix[5][5], result[5][5] = {0,};
    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++)
            scanf("%d", &matrix[i][j]);
            result[i][i] = 1;
    }
	
    while (B){
        if (B&1) square(result, matrix);
        square(matrix, matrix);
        B >>= 1;
    }
	
    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++)
            printf("%d ", result[i][j]);
        putchar(10);
    }
}

출처

 

10830번: 행렬 제곱

크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 2086] 피보나치 수의 합 [C]  (0) 2021.08.21
[백준 11444] 피보나치 수 6 [C]  (0) 2021.08.21
[백준 13172] Σ [C]  (0) 2021.08.20
[백준 16953] A → B [C/C++]  (0) 2021.08.20
[백준 5639] 이진 검색 트리 [C]  (0) 2021.08.19