Processing math: 100%

PS/BOJ

BOJ 8222 - Distance

leo020630 2023. 2. 3. 03:12

지난 글에서 추천받은 대로 이번에는 OI Checklist에서 문제를 골라 보았다. OI Checklist에서 하나를 뽑으려니 감이 잘 안와서 POI 문제들이 많은 https://www.acmicpc.net/workbook/view/1939에 가 하나를 골라 보았다. 고른 문제는 POI 2012의 Distance이다. 

 

문제 요약

두 자연수 x,y의 거리 d(x,y)x에 소수를 곱하거나, 나누는 연산을 해 y에 도달하기 위한 최소 연산 횟수로 정의하자. 배열 A가 주어질 때, 각 i에 대해서 d(Ai,Aj)가 최소가 되는 j를 구하여라.

 

풀이

우선, 같은 수가 여러 개 있는 경우는 전처리로 해결해 줄 수 있으므로 모든 수가 다르다고 가정하자.

x에서 y로 이동하는 법은 g=gcd(x,y)를 거치는 것이 최적이다. 즉, f(x)x의 소인수 개수라 하면 d(x,y)=f(xg)+f(yg)=f(x)+f(y)2f(g)이다. gx를 고정하면 f(y)의 최솟값만 보면 되므로, g의 배수들 중 (f(x),i) pair가 가장 작은 두 쌍을 저장해주는 방식으로 해결할 수 있다. f(i)는 소수 거듭제곱에 대해 체와 같은 방식으로 구해줄 수 있다. 배수를 보기 때문에 시간 복잡도는 O(MXlogMX)이다.

 

문제를 풀고 나서 팀원 선배들한테 추천해줬더니 다들 빨리 풀고 기여해서 티어가 D5에서 P1로 떨어졌다. 다이아라고 하기엔 쉬운 것 같긴 하다.

'PS > BOJ' 카테고리의 다른 글

BOJ 3311 - Traffic  (1) 2024.04.05
BOJ 12918 - 정리정돈 (+BOJ 2000솔)  (4) 2023.06.14
BOJ 18189 - 참 어려운 문제  (3) 2023.02.01
BOJ 9244 - 핀볼 (및 Class 9 취득)  (0) 2022.11.10
BOJ 10076 - 휴가  (0) 2022.11.10