ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10830번 행렬 제곱
    PS 2021. 4. 8. 02:17

    www.acmicpc.net/problem/10830

     

     

     

     

    <접근방법>

    분할 정복을 이용한 거듭제곱과 연산만 다르고 똑같습니다.

     


     

     

     

    <코드>

    #include <iostream>
    #include <algorithm>
    #include <memory.h>
    #include  <vector>
    using namespace std;
    
    typedef vector<vector<long long>> vec;
    
    long long N, B;
    vec map(6, vector<long long>(6, 0));
    
    
    void  print(vec v) {
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			cout << v[i][j] << ' ';
    		}
    		cout << '\n';
    	}
    }
    
    vec doMod(vector<vector<long long>> v) {
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			v[i][j] %= 1000;
    		}
    	}
    	return v;
    }
    
    vec doMul(vec v1, vec v2) {
    	vec tmap(6, vector<long long>(6, 0));
    
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			for (int k = 0; k < N; k++) {
    				tmap[i][j] += ((v1[i][k] * v2[k][j])) % 1000;
    			}
    			tmap[i][j] %= 1000;
    		}
    	}
    
    	return tmap;
    }
    
    
    vec solve(long long b) {
    	if (b == 1) {
    		return map;
    	}
    
    	vec half = solve(b/2);
    	half = doMod(half);
    
    	vec next = doMul(half, half);
    
    	if (b % 2 == 0) {
    		return next;
    	}
    	else {
    		next = doMul(next, map);
    		return next;
    	}
    
    }
    
    int  main() {
    	cin >> N >> B;
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			cin >> map[i][j];
    		}
    	}
    	map = doMod(map);
    	
    	print(solve(B));
    
    	return 0;
    }

     

    'PS' 카테고리의 다른 글

    백준 2104번 부분배열 고르기  (0) 2021.04.14
    백준 5904번 Moo게임  (0) 2021.04.08
    백준 20164 홀수 홀릭 호석  (0) 2021.04.08
    백준 1780번 종이의 개수  (0) 2021.04.08
    백준 13171 A  (0) 2021.04.06
Designed by Tistory.