일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- flows
- 백준
- disjoint-set
- BFSDFS
- Dag
- dynamic programming
- graph
- BST
- Euler circuit
- BOJ
- Eulerian circuit
- Sieve_of_Eratosthenes
- implementation
- scc
- Greedy
- Cycle detecting
- graph modeling
- DynamicProgramming
- bitmask
- Eulerian path
- GCD
- Shortest path
- Euler path
- backtracking
- Algospot
- Segment Tree
- POJ
- hashing
- mathematics
- CS Academy
- Today
- Total
그냥 하는 노트와 메모장
BOJ 14559 - Protocol 본문
* BOJ 14559 - Protocol
[분류 - 수학, 다이나믹 프로그래밍]
아이디어를 생각하기 어려운 문제..
구하고자 하는 건 M세대를 거쳐 2^M개의 112345^k꼴로 표현되는 수의 합입니다. x+1 세대의 합을 x 세대로 표현이 가능해야 큰 수 M에 대응할 수 있습니다. 하지만 f(x), g(x)로 x+1을 나타낼 수가 없습니다. 즉, 다른 트릭을 쓰지 않고서는 범위를 줄일 수 없고, 점화식을 구할 수 없습니다.
(페르마 소정리) 임의의 소수 p에 대해 임의의 양의 정수 x(x<p)에 대해 x의 곱셈 역원은 x^(p-2) mod m입니다. 따라서 112345도 곱셈의 역원이 분명 존재합니다. 이는 112345^(m-2)임을 알 수 있는데 여기서 112345^(m-1)=1 mod m임을 알 수 있습니다. 따라서 m-1의 임의의 약수 k에 대해 112345^k=1이 되는 가장 작은 k를 찾아봅시다. 이 값이 매우 크면 이 방법을 사용할 수 없습니다.
실제로 112345라는 수에 대해서 가장 작은 k는 167임을 구할 수 있습니다.
(행렬) 이제 167 x 167 행렬에서 x 세대에서 x+1 세대로 갈 때 승수에 대해서 167로
나눈 나머지로 축약시킬 수 있으므로 점화식을 구할 수 있습니다. 즉 (i, j)에 들어가야하는 값은 x세대 때 j였던 것의 개수가 x+1세대 때 i로 가는 경우의 수로 나타낼 수 있습니다. 간단하게 구하면 x세대 때 j는 f(j)와 g(j)로 두 개의 경우의 수로 나뉘기 때문에 각각 구해줍시다.
,
167 x 1 행렬은 초기 0세대에 대한 값이고 167 x 1 행렬 X_M는 M세대 이후의 상태도라고 보시면 됩니다.
※ 벌레 캠프 머시기 알고리즘으로도 풀린다곤 하네요,, 전 모르겟네요~
'Solved problems' 카테고리의 다른 글
BOJ 3026 V (0) | 2020.05.18 |
---|---|
BOJ 10564 - 팔굽혀펴기 (0) | 2020.04.22 |
BOJ 13011 - 사탕의 밀도 (0) | 2020.02.26 |
BOJ 13010 - h(n) (0) | 2020.02.25 |
CS Academy - Substring restrictions (0) | 2020.01.21 |