
01. ๐ ๋ฌธ์ ํ์
D: ์ค์์ด๊ฐ ์ฐ์ฑ
ํ ์๊ฐ (D๋ถ)
ํ ๊ฑด๋ฌผ์์ ์ธ์ ํ ๋ค๋ฅธ ๊ฑด๋ฌผ๋ก ์ด๋ํ๋ ์๊ฐ 1๋ถ
์บ ํผ์ค์ ์ง๋๊ฐ ์์ ๊ฐ์ ๋, ์ ๋ณด๊ณผํ๊ด์์ ์์ํ์ฌ D๋ถ์ด ๋ ๋ ์ ๋ณด๊ณผํ๊ด์ผ๋ก ๋์ฐฉ ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์๋ฅผ ์ถ๋ ฅ
01-1. ๊ฐ๋ฅํ ์๊ฐ ๋ณต์ก๋
- D์ ์ต๋๊ฐ 1e9๋ก ์๊ฐ ๋ณต์ก๋ $O(log D)$์ดํ๋ก ๊ตฌํ
01-2. ์๊ณ ๋ฆฌ์ฆ ์ ํ
- ๋ถํ ์ ๋ณต์ ์ด์ฉํ ์ ์ด ํ๋ ฌ์ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ๊ตฌํ
02. ๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
๊ฐ ๋ ธ๋(๊ฑด๋ฌผ)์ ๋ฒํธ๋ฅผ ๋ถ์ฌ, ๊ฐ ์ ์๋ ์ธ์ ํ ๊ฑด๋ฌผ์ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
| ์ ๋ณด๊ณผํ๊ด (1) | 2 | 4 | ||
| ์ ์ฐ๊ด (2) | 1 | 3 | 4 | |
| ์ ์๊ด (3) | 2 | 4 | 5 | 6 |
| ๋ฏธ๋๊ด (4) | 1 | 2 | 3 | 6 |
| ์ง๋ฆฌ๊ด (5) | 3 | 6 | 7 | |
| ํ๊ฒฝ์ง๊ธฐ๋ ๊ด (6) | 3 | 4 | 5 | 8 |
| ํ์ํ๊ด (7) | 5 | 8 | ||
| ํ๋จ๊ณตํ๊ด (8) | 6 | 7 |
์ฒ์ ์ถ๋ฐ์ ์ ๋ณด๊ณผํ๊ด์ด๋ค. 0๋ถ(D=0) ์ผ๋, ๊ฐ ๊ฑด๋ฌผ์ ๊ฐ ์ ์๋ ๊ฒฝ๋ก๋ ์๋์ ๊ฐ๋ค.
$V(0) = [1, 0, 0, 0, 0, 0, 0, 0]$
๊ทธ๋ฆฌ๊ณ 1๋ถ์ด ์ง๋ฌ์ ๋๋, ์ ๋ณด๊ณผํ๊ด์์ ๊ฐ ์ ์๋ ๊ณณ์ ๋์ฐฉํด์์ ๊ฒ์ด๋ค.
$V(1) = [0, 1, 0, 1, 0, 0, 0, 0]$
2๋ถ์ด ์ง๋ฌ์ ๋, ์ ๋ณด๊ณผํ๊ด์ผ๋ก ๋์์ค๋ ๋ฃจํธ๋ 1 > 2 > 1 ๊ณผ 1 > 4 > 1 ๋ก 2๊ฐ์ง๊ฐ ๋ ๊ฒ์ด๋ค.
$V(2) = [2, 1, 2, 1, 0, 1, 0, 0]$
์์ ๊ณผ์ ์ ํ๋ ฌ์์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
$$
V(D+1) =
\begin{bmatrix}
0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 \\
1 & 0 & 1 & 1 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 1 & 1 & 1 & 0 & 0 \\
1 & 1 & 1 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 1 & 1 & 0 \\
0 & 0 & 1 & 1 & 1 & 0 & 0 & 1 \\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 \\
0 & 0 & 0 & 0 & 0 & 1 & 1 & 0
\end{bmatrix} *
V(D)
$$
ํธ์์ ์ ์ด ํ๋ ฌ์ A๋ก ์นํํ์ฌ ๋ณด์.
$V(1) = A \cdot V(0)$
$V(2) = A \cdot V(1) = A^2 \cdot V(0)$
$V(3) = A \cdot V(2) = A^3 \cdot V(0)$
$\therefore V(D) = A^D \cdot V(0)$
์ด๋ฅผ ์ฝ๋๋ก ์ค๊ณํด๋ณด๋ฉด,
- ์ ์ด ํ๋ ฌ(๊ฐ ๊ฑด๋ฌผ์ ์ธ์ ํ ๊ฑด๋ฌผ์ 2์ฐจ์ vector๋ก ๋ํ๋ธ ๊ฒ) A ์ด๊ธฐํ
- ํ๋ ฌ A์ D๋งํผ ์ ๊ณฑ ์ํ
- ํ๋ ฌ A์ D / 2๋ฅผ ์ ๊ณฑํ ํ๋ ฌ์ ์ฌ๊ท์ ์ผ๋ก ๊ณฑํด์ค
$(A * A \rightarrow A^2 * A^2 ... \rightarrow A^{D/2} * A^{D/2} = A^D)$
- ํ๋ ฌ A์ D / 2๋ฅผ ์ ๊ณฑํ ํ๋ ฌ์ ์ฌ๊ท์ ์ผ๋ก ๊ณฑํด์ค
- $A^D$ํ๋ ฌ์ (0, 0) ์์น์ ๊ฐ์ ์ ๋ณด๊ณผํ๊ด(0๋ฒ ์ ์ )์ ๋ค์ ๋๋ฌํ๋ ๊ฒฝ๋ก ์๋ฅผ ๋ํ๋
03. ๐ ๏ธ ์๋๋ณ ์์
1ํ์ฐจ
04. ๐๏ธ ์ ๋ต ์ฝ๋
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<vector<ll>> matrix;
const ll MOD = 1e9+7;
matrix operator*(const matrix& a, const matrix& b){
const int N = a.size(), M = b.size(), K = b[0].size();
matrix res = matrix(N, vector<ll>(K, 0));
for(int i = 0; i < N; i++)
for(int j = 0; j < K; j++)
for(int l = 0; l < M; l++)
res[i][j] = (res[i][j] + a[i][l] * b[l][j]) % MOD;
return res;
}
matrix pow(matrix a, ll n){
if(n == 1) return a;
matrix half = pow(a, n / 2);
matrix res = half * half;
if(n % 2 == 1) res = res * a;
return res;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
ll D; cin >> D;
matrix A = {
{0, 1, 0, 1, 0, 0, 0, 0},
{1, 0, 1, 1, 0, 0, 0, 0},
{0, 1, 0, 1, 1, 1, 0, 0},
{1, 1, 1, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 0, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0, 1},
{0, 0, 0, 0, 1, 0, 0, 1},
{0, 0, 0, 0, 0, 1, 1, 0}
};
cout << pow(A, D)[0][0] << "\n";
return 0;
}
'Problem Solving > Baekjoon Online Judge (BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [C++] BOJ 9328 - ์ด์ (1) | 2025.04.22 |
|---|---|
| [C++] BOJ 19238 - ์คํํธ ํ์ (0) | 2025.04.21 |
| [C++] BOJ 11444 - ํผ๋ณด๋์น ์ 6 (0) | 2025.04.20 |
| [C++] BOJ 2638 - ์น์ฆ (0) | 2025.04.20 |
| [C++] BOJ 9019 - DSLR (0) | 2025.04.19 |
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์!