티스토리 뷰
문제 링크: https://www.acmicpc.net/problem/20412
20412번: 추첨상 사수 대작전! (Hard)
한 줄에 걸쳐 준표가 좋아하는 소수 m, 참가자들이 정한 Seed, 시연으로 공개된 X1, X2 이 주어진다. 항상 가능한 상황만 입력으로 주어진다.
www.acmicpc.net
문제 풀이
페르마의 소정리
페르마의 소정리를 이용하여 풀었다.
$(a \times Seed+c) \equiv X1 \;(mod \; m)$와 $(a \times X1+c) \equiv X2 \;(mod \; m)$를 빼서 한개의 연립합동방정식을 만든다.
$a(Seed-X1) \equiv X1 - X2 \;(mod \; m)$가 되는데 m은 소수이고 0 < Seed, X1, X2 < m라고 명시되어 있으므로 Seed-X1 < m이고, m은 소수이기 때문에 양의 배수가 존재할 수 없다. 따라서 Seed-X1과 m은 서로소이며 즉, 페르마의 소정리를 이용할 수 있다.
여기서 페르마의 소정리를 간단하게 얘기하자면 p와 m은 서로소이고 m이 소수면 $p^{m-1} \equiv 1 \; (mod \; m)$을 만족한다.
다시 위의 식으로 돌아와보자. 우리가 구해야 하는건 a와 c이고 $a(Seed-X1) \equiv X1 - X2 \;(mod \; m)$의 식에서 m,Seed, X1, X2는 입력으로 주어지므로 (Seed-X1)의 값은 알고 있다. 또한 X1-X2의 값도 알고 있다.
그러면 양변에 $(Seed-X1)^{m-2}$를 곱해준다.
좌변은 $a(Seed-X1)^{m-1}$이 될 것이고 우변은 $(X1-X2) \times (Seed-X1)^{m-2}$가 될 것이다.
이때 위에서 얘기한 Seed-X1과 m은 서로소, m은 소수, $p^{m-1} \equiv 1 \; (mod \; m)$를 이용하면 $(Seed-X1)^{m-1} \equiv 1 \;(mod \; m)$가 되고 이 식을 이용한다.
정리하면 $a(Seed-X1)^{m-1} \equiv (X1-X2) \times (Seed-X1)^{m-2} \;(mod \; m)$은 $a \equiv (X1-X2) \times (Seed-X1)^{m-2} \; (mod \; m)$가 된다. 뒤의 연산은 분할 정복을 이용한 거듭제곱을 이용하면 빠르게 구할 수 있다.
이제 a를 구했다면 c는 X1 = (a × Seed + c) % m 식에서 $c \equiv X1-(a \times Seed) \;(mod \; m)$로 변형하여 c를 구할 수 있다.
코드
여담으로 이 코드는 가장 처음에 풀은 코드를 업로드 했는데 pow 함수에서 pow(a, b, m)을 이용하면 a^b%m을 알아서 분할 정복해서 값을 내어준다. 그 외에 자잘한 공백들을 없애서 76B로 정답을 맞췄다.
'BOJ' 카테고리의 다른 글
[BOJ][Python] 백준 16973번 - 직사각형 탈출 (0) | 2022.08.05 |
---|---|
[BOJ][Python] 백준 4658번 - 삼각형 게임 (0) | 2022.08.03 |
[BOJ][Python][C++] 백준 24417번 - 알고리즘 수업 - 피보나치 수 2 (0) | 2022.04.05 |
[BOJ][Python] 백준 24267번 - 알고리즘 수업 - 알고리즘의 수행 시간 6 (0) | 2022.01.16 |
[BOJ][Python] 백준 24268번 - 2022는 무엇이 특별할까? (0) | 2022.01.16 |
- Total
- Today
- Yesterday
- backtracking
- Simulation
- MST
- 정렬
- 그리디
- Python
- 너비 우선 탐색
- 수학
- Brute Force
- set
- 백트래킹
- math
- 시뮬레이션
- greedy
- DP
- BFS
- 볼록 껍질
- 파이썬
- 최소 신장 트리
- convex hull
- 위상 정렬
- Sorting
- BOJ
- 다이나믹 프로그래밍
- TEXT
- 집합과 맵
- 브루트포스
- Implementation
- 구현
- Topological Sorting
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |