현재 값이 n일 때, 과정이 끝날 때까지 걸리는 시간의 기댓값을 f(n)이라 하자. f(1)=0이다.
n>1에서 2,3,⋯,n 중 n의 약수인 수를 골랐을 때에만 값이 작아진다. n의 양의 약수 개수를 τ(n)이라 하면, 2 이상인 약수는 τ(n)−1개이다.
현재 상태에서 한 번의 선택을 수행한 뒤의 기댓값을 그대로 식으로 쓰면
f(n)
x가 2 이상인 n의 약수를 모두 돌 때 n/x는 n의 모든 진약수를 정확히 한 번씩 돈다. 따라서 식을 정리하면
f(n)=τ(n)−1n
오른쪽에는 항상 n보다 작은 값의 f만 등장하므로 n=2,3,⋯ 순서로 계산할 수 있다.
이를 O(MlogM)에 전처리할 수 있다. 여기서 M은 모든 테스트 케이스의 N 중 최댓값이다. 배열 Sn에 의 진약수 에 대한 의 합을, 배열 에 진약수의 개수를 저장한다. 을 계산한 직후 모든 에 과 을 각각 더하면 된다. 전체 갱신 횟수는
n=1∑M⌊nM
이다.
각 테스트 케이스의 답은 전처리된 f(N)을 소수점 아래 둘째 자리까지 반올림해 출력하면 된다.
Solution written by GPT5.6