728x90
https://www.acmicpc.net/problem/10830
10830번: 행렬 제곱
크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
문제 11444 를 풀고 나서
바로 행렬 제곱이 눈에 보이길래 해결하였다.
근데 문제를 풀 때 자꾸 특정 퍼센트에서 틀리길래 뭐지 싶었는데
제일 처음 원소값으로 1000이 입력되고 만약 B가 1이라면
해당 원소값은 0이 되어야하는데
1000이 그대로 나왔다.
해당 처리를 안해서 몇번 틀렸다.
#include <iostream>
#include <vector>
using namespace std;
typedef unsigned long long type;
#define MOD 1000
vector<vector<type>> base;
type N, B;
vector<vector<type>> arrMult(vector<vector<type>> a, vector<vector<type>> b) {
vector<vector<type>> arr(N,vector<type>(N,0));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
type result = 0;
for (int k = 0; k < N; k++) {
result += (a[i][k] * b[k][j]) % MOD;
}
arr[i][j] = result % MOD;
}
}
return arr;
}
vector<vector<type>> powarr(type B) {
if (B == 1)
return base;
vector<vector<type>> temp = powarr(B / 2);
vector<vector<type>> multResult = arrMult(temp, temp);
if (B % 2 == 0) {
return multResult;
}
else {
return arrMult(multResult, base);
}
}
int main(void) {
cin >> N >> B;
base.resize(N, vector<type>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> base[i][j];
}
}
vector<vector<type>> ans = powarr(B);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << ans[i][j] % MOD<<" ";
}
cout << "\n";
}
}
728x90
'문제 > 백준' 카테고리의 다른 글
c++ 백준_11444_"피보나치 수 6" (0) | 2023.06.11 |
---|---|
c++ 백준_11049_"행렬 곱셈 순서" (2) | 2023.06.11 |
c++ 백준_2096_"내려가기" (0) | 2023.06.09 |
c++ 백준_17144_"미세먼지 안녕!" (0) | 2023.06.09 |
c++ 백준_14938_"서강그라운드" (0) | 2023.06.09 |