Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • Network
  • docker
  • 백트래킹
  • BFS
  • Kubernetes
  • DFS
  • django
  • boj
  • 다이나믹 프로그래밍
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[백준 10830] 행렬 제곱 C++
Algorithm/BOJ

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

2021. 3. 10. 04:07

분할 정복은 어렵다!

 

거듭제곱에 대해서는 위와 같이 분할이 일어난다.

-> m이 짝수일 때, 홀수일 때 분할이 달라지는건 코드에 표현되어있다.

개인적으로 class를 만들어서 객체간의 연산을 해주는 방식으로 만들어서 마음에 든다!

#include <iostream>
#include <cstring>
using namespace std;

int N;
long long B;

// 정방 행렬을 저장하는 class
class Matrix{

public:
    int Map[6][6];
    
    Matrix(){}
    Matrix(int n){
        int in;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                cin >> in;
                Map[i][j] = in % 1000;
            }
        }
    }
    
    // 연산자 오버로딩을 통해서 행렬의 곱셈 구현
    Matrix operator* (Matrix& m){
        Matrix temp;
        
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                temp.Map[i][j] = 0;
                for(int k = 0; k < N; k++){
                    temp.Map[i][j] += ((this->Map[i][k] * m.Map[k][j]) % 1000);
                    temp.Map[i][j] %= 1000;
                }
            }
        }
        
        return temp;
    }
    
    // 행렬의 원소를 보여주는 함수
    void show(){
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                cout << Map[i][j] << " ";
            }
            cout << "\n";
        }
    }
};

// 분할정복을 통해서 거듭제곱을 해준다
Matrix power(Matrix& M, long long b){
    
    if(b == 1) return M;
     
    // 홀수일 때는 A^m은 A * A^(m-1) 로 나뉘게 된다
    if(b % 2) return power(M, b-1) * M;
    Matrix half = power(M, b/2);
    
    return half * half;
}

int main(){
    
    cin >> N >> B;
    
    Matrix M1(N);
    //result 행렬을 M1을 B제곱한 행렬로 초기화 해준다
    Matrix result = power(M1, B);
    result.show();
    
    return 0;
}

2021/03/09

'Algorithm > BOJ' 카테고리의 다른 글

[백준 2798] 블랙잭 C++  (0) 2021.03.22
[백준 1074] Z C++  (0) 2021.03.10
[백준14500] 테트로미노 C++  (0) 2021.03.07
[백준 9252] LCS2 C++  (2) 2021.03.05
[백준 1535] 안녕 C++  (0) 2021.02.26
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 2798] 블랙잭 C++
    • [백준 1074] Z C++
    • [백준14500] 테트로미노 C++
    • [백준 9252] LCS2 C++

    티스토리툴바