dmswl022329   2년 전

문제의 입력에서 a, X0, c 의 범위가 10^18 까지 인데

a 와 X0 이 둘다 10^18 - 1 이 나오고

mod 가 10^18 이면

첫 연산부터 10^36 을 계산하게 되어 오버플로우가 납니다.


그래서 첫번째 해결방법이 모듈러 연산의 값을 음수로 내리는 것 이었습니다.

위에서 가정한 mod a X0 를 가지고 다음과 같이 연산을 하면

(((a % mod) - mod) * ((X0 % mod) - mod) + mod) % mod


a%mod 는 a 이고

a - mod 는 -1 입니다

X0%mod 도 마찬가지로 X0

X0 - mod = -1

-1 * -1 = 1

(1 + mod) % mod = 1

이렇게 했습니다.



하지만 이러면 음수 상태에서 곱해서 오버플로우가 날 수 있기 때문에 


모듈러 연산할 수의 절대값의 제곱근 값이 root(10^18) 보다 작게 해서 곱하면 될거라고 생각했습니다.


그럼에도 4%에서 틀렸습니다 가 나옵니다.

수 범위를 어떻게 하면 오버플로우를 방지하면서 계산할 수 있을까요? 

방법을 제시해 주세요...


 

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