[C++] 백준/Gold/10830. 행렬 제곱

2025. 1. 21. 21:06·C++/Algorithm

문제: 행렬 제곱(백준 10830번)

문제 분석

$N \times N$ 크기의 행렬을 $B$번 제곱한 결과를 출력하는 문제이다.

보통 이런 지문 자체가 간단한 문제들은 입력 범위가 특정 알고리즘을 사용해야 시간 초과가 나지 않도록 설계되어 있다. 이번 문제 역시 단순히 행렬 제곱을 반복적으로 계산하면 $O(N^3 \times B)$의 시간 복잡도를 가지므로 1000억 번의 연산이 필요하다. 따라서 시간 복잡도를 $O(\log B \times N^3)$ 수준으로 줄일 수 있는 알고리즘이 필요하다.

거듭 제곱을 이용한 행렬 제곱 알고리즘

거듭 제곱을 활용하면, 행렬을 효율적으로 제곱할 수 있다.
행렬 $M$을 $B$번 제곱하는 과정을 다음과 같이 분할 정복 방식으로 처리한다.

  1. $B = 0$일 경우, 단위 행렬을 반환한다.
  2. $B$가 홀수일 경우: $M^B = M \times M^{B-1}$
  3. $B$가 짝수일 경우: $M^B = \left(M^{B/2}\right) \times \left(M^{B/2}\right)$

이 방식을 적용하면, 제곱 연산의 반복 횟수를 $O(\log B)$로 줄일 수 있다.

코드 전체

#include <bits/stdc++.h>
using namespace std;

class Matrix : public vector<vector<int>> {
public:
    Matrix operator *(const Matrix& a) const {
        int n = size();
        Matrix result;
        result.resize(n, vector<int>(n));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                    result[i][j] += at(i).at(k) * a[k][j];
                }
                result[i][j] %= 1000;
            }
        }
        return result;
    }
};

Matrix Power(Matrix m, long long b) {
    int n = m.size();
    Matrix result;
    result.resize(n, vector<int>(n));
    for (int i = 0; i < n; i++) result[i][i] = 1;

    while (b > 0) {
        if (b % 2 == 1) {
            result = result * m;
        }
        m = m * m;
        b >>= 1;
    }
    return result;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; long long b; cin >> n >> b;
    Matrix m; m.resize(n, vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> m[i][j];
        }
    }

    Matrix result = Power(m, b);
    for (const auto& row : result) {
        for (int val : row) cout << val << ' ';
        cout << '\n';
    }
}

 

'C++ > Algorithm' 카테고리의 다른 글

[C++] 백준/Silver/1004. 어린 왕자  (0) 2025.01.24
[C++] 백준/Gold/2225. 합분해  (0) 2025.01.23
[C++] 백준/Silver/1946. 신입 사원  (0) 2025.01.17
[C++] 백준/Gold/1918. 후위 표기식  (0) 2025.01.15
[C++] 백준/Gold/16724. 피리 부는 사나이  (1) 2025.01.14
'C++/Algorithm' 카테고리의 다른 글
  • [C++] 백준/Silver/1004. 어린 왕자
  • [C++] 백준/Gold/2225. 합분해
  • [C++] 백준/Silver/1946. 신입 사원
  • [C++] 백준/Gold/1918. 후위 표기식
돼지표
돼지표
https://github.com/wkdgns135
  • 돼지표
    돼지표 개발 스토리
    돼지표
  • 전체
    오늘
    어제
    • 분류 전체보기 (98) N
      • C++ (58)
        • Algorithm (52)
      • Python (1)
      • Machine Learning (2)
      • Computer Graphics (4)
        • Curly Hair Simulation (2)
      • GPU Programming (11)
        • CUDA basic (7)
        • CUDA fluidsGL (4)
      • Unreal 5 (19)
        • Troubleshooting (4)
        • FPS Shooting (5)
        • Study (8)
        • EOS (1)
      • Computer Science (3) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    C++
    Rendering Pipeline
    자료 구조
    Algorithm
    위상 정렬
    수학
    아이작 맵 생성
    dp
    unreal 5
    그래프 이론
    UE5
    CUDA
    그리디 알고리즘
    Fluid Simulation
    그래프 탐색
    FPS
    BFS
    구현
    OpenGL
    GPU Programming
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
돼지표
[C++] 백준/Gold/10830. 행렬 제곱
상단으로

티스토리툴바