kimhs   2년 전

똑같은 로직으로 구현했는데 c++에서는 시간초과가 납니다.

혹시 vector를 처리하는 부분이 문제인 건가요?

ldhun041203   2년 전

저도 c++해서 못 푼 사람입니다.

매우 큰 숫자로 시도해보니 __int128을 사용해도 결과가 나오지 않았습니다. 입력 범위가 10^18이라 제곱을 하게 되면 overflow가 일어나는 것 같습니다. 전에 글 쓴 분께서는 플라드 로에서 루프가 생기는 부분을 해결했다고 하셨는데 저는 어떻게 하는지 잘 모르겠군요.


파이썬은 정수 크기가 제한이 무제한인 걸로 알고 있는데, 이 때문에 파이썬에서는 결과를 내주는 것 같습니다.

실제로 파이썬으로 실행해보니, c++과는 다르게 결과를 보여주더군요. (질문 글 중  테스트 케이스 모음 중 매우 큰 수를 이용했습니다.)


kimhs   2년 전

답변 감사합니다

오버플로 관련해서 좀 더 생각해봐야겠네요.

yup0927   2년 전

입력으로 큰 수들을 넣었을 때 답이 나오지가 않습니다.

(4611686018427387903, 4611686018427387902, 4611686018427387901, 4611686018427387899 등)

__int128로 바꿨을 때 일단 무한 루프를 도는 것 같지는 않습니다.

저 같은 경우에는 밀러 라빈과 거듭제곱에서 오버플로우가 나면서 무한 루프를 돌아 TLE가 나서 삽질을 했었습니다.

코드의 로직이 제대로 되었는지는 확인해보진 않았으나 파이썬에서는 돌아갔다고 하니 문제는 없을테고.. long long을 __int128로 바꿨을 때 무한 루프는 안 돈다는 점에서 일단 오버플로우가 문제가 아닐까 싶네요.

+추가로 확인해보니 입력 제한보다도 훨씬 작은 숫자에서도 돌지 않습니다.

찾은 제일 작은 케이스가 4294967311인데 소수임에도 __isprime에서 false를 반환합니다.

kimhs   2년 전

반례 감사합니다!

댓글을 작성하려면 로그인해야 합니다.