1160번 - Random Number Generator
문제의 입력에서 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%에서 틀렸습니다 가 나옵니다.
수 범위를 어떻게 하면 오버플로우를 방지하면서 계산할 수 있을까요?
방법을 제시해 주세요...
댓글을 작성하려면 로그인해야 합니다.
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%에서 틀렸습니다 가 나옵니다.
수 범위를 어떻게 하면 오버플로우를 방지하면서 계산할 수 있을까요?
방법을 제시해 주세요...