본문 바로가기

백준 & 알고리즘

[파이썬] 백준 17633번 - 제곱수의 합 (More Huge) 풀이

https://www.acmicpc.net/problem/17633

티어: 다이아몬드 3

 

로직

이 문제와 동일하지만 n의 범위가 작은 문제가 있습니다. (https://www.acmicpc.net/problem/1699)

여기선 n이 100000까지라 dp로 충분했었는데, 이 문제는 n의 범위가 심상치 않음 ( 10¹⁸... )

 

문제 지문에 문제를 푸는 결정적인 힌트가 나와있습니다. 라그랑주의 네 제곱수 정리인데, 이와 비슷하게 르장드르의 세 제곱수 정리, 페르마의 두 제곱수 정리 또한 존재합니다.

 

르장드르 세 제곱수 정리

https://en.wikipedia.org/wiki/Legendre%27s_three-square_theorem

꼴이 아닌 모든 정수 는 3개 이하의 제곱수의 합으로 표현 가능하다.

 

페르마 두 제곱수 정리

https://ko.wikipedia.org/wiki/%ED%8E%98%EB%A5%B4%EB%A7%88_%EB%91%90_%EC%A0%9C%EA%B3%B1%EC%88%98_%EC%A0%95%EB%A6%AC

어떤 정수의 4n + 3 형태로 나타낼 수 있는 소인수가 모두 짝수 개라면 2개 이하의 제곱수의 합으로 표현 가능하다.

 

 

제곱수 1개로 표현할 수 있는지는 그 수가 제곱수인지 확인하면 되므로 간단히 구현 가능합니다.

 

큰 수의 소인수들을 모두 구해야 하므로 Pollard-Rho 소인수분해 알고리즘을 사용합니다.