1 ≤ R, G ≤ 1,000,000,000이란 말은 R, G 두 수 모두 1,000,000,000 이하라는 말입니다.
여기서 두 수의 최대공약수도 1,000,000,000 이하이므로 O(최대공약수)의 시간복잡도를 가지면 TLE가 나게 됩니다.
(어떤 수)의 약수(여기서는 최대공약수의 약수)를 구하는 방법은 루트(어떤 수) 만에 할 수 있습니다.
예를 들어 20의 약수를 생각해봅시다. 1, 2, 4, 5, 10, 20이 있습니다.
이는 달리 표현하면, 1, 2, 4, 20/4, 20/2, 20/1이 됩니다.
여기서 뭔가가 보이시나요?
1 ~ 루트(어떤 수) 까지 중 20의 약수인 것들을 Xi라 하면, (어떤 수)/Xi한 것들이 대칭적으로 약수가 되게 됩니다.
단 주의할 부분은 (어떤 수)/Xi 와 Xi가 같은 경우인데, 이 경우는 (어떤 수)가 제곱수일 경우 생기며, 하나만 반영해주시면 됩니다. (16의 약수는 1, 4, 16/4, 16/1인데 4와 16/4는 같으므로 실제 약수는 1, 4, 16)
두 수의 최대공약수의 루트 만큼의 시간복잡도를 가지면 되므로 O(루트(1000000000))에 해결할 수 있습니다.
yukariko 9년 전
제가 생각해낸것은 두 수의 최대 공약수를 구해서 거기서부터 1씩 줄여가면서 출력하는건데..
이래도 시간초과가 나네요.
다른 방법은 어떤게 있나요?