[BOJ][Python] 백준 20412번 - 추첨상 사수 대작전! (Hard)
문제 링크: https://www.acmicpc.net/problem/20412
20412번: 추첨상 사수 대작전! (Hard)
한 줄에 걸쳐 준표가 좋아하는 소수 m, 참가자들이 정한 Seed, 시연으로 공개된 X1, X2 이 주어진다. 항상 가능한 상황만 입력으로 주어진다.
www.acmicpc.net
문제 풀이
페르마의 소정리
페르마의 소정리를 이용하여 풀었다.
여기서 페르마의 소정리를 간단하게 얘기하자면 p와 m은 서로소이고 m이 소수면
다시 위의 식으로 돌아와보자. 우리가 구해야 하는건 a와 c이고
그러면 양변에
좌변은
이때 위에서 얘기한 Seed-X1과 m은 서로소, m은 소수,
정리하면
이제 a를 구했다면 c는 X1 = (a × Seed + c) % m 식에서
코드
m, seed, x1, x2 = map(int, input().split()) | |
ans, sq = 1, seed-x1 | |
for i in reversed(bin(m-2)[2:]): | |
if i == '1': | |
ans = (ans*sq)%m | |
sq = (sq*sq)%m | |
a = (ans*(x1-x2))%m | |
c = (x1-(a*seed))%m | |
print(a, c) |
여담으로 이 코드는 가장 처음에 풀은 코드를 업로드 했는데 pow 함수에서 pow(a, b, m)을 이용하면 a^b%m을 알아서 분할 정복해서 값을 내어준다. 그 외에 자잘한 공백들을 없애서 76B로 정답을 맞췄다.