Algorithm

[Algorithm] 백준 알고리즘 기초 1/2 - 나머지 연산

tenacy 2024. 7. 19. 15:20

나머지 연산

컴퓨터의 정수는 저장할 수 있는 범위가 저장되어 있기 때문에, 답을 $M$으로 나눈 나머지를 출력하라는 문제가 등장한다.

Overflow 문제와 덧셈

$(A+B)\mod{B}$


하지만, 위 식에서 만약 $A+B$의 연산 결과가 자료형의 범위를 넘어서게 되면 overflow가 발생한다.
이 때, $A$와 $B$ 각각에 나머지 연산을 적용하여 overflow를 막을 수 있다.


$(A+B)\mod{M}=((A\mod{M})+(B\mod{M}))\mod{M}$

곱셈

곱셈은 덧셈의 연속이기 때문에 곱셈에서는 다음의 식이 성립한다.


$(A\times{B})\mod{M}=((A\mod{M})\times{(B\mod{M})})\mod{M}$

나눗셈

나눗셈에서는 성립하지 않고 모듈러 역수(Modular Inverse)를 구하여 해결한다.


$(A\div{B})\mod{M}\neq((A\mod{M})\div{(B\mod{M}))}\mod{M}$

뺄셈

뺄셈의 경우에는 먼저 $\mod{}$ 연산을 한 결과가 음수가 나올 수 있기 때문에 $M$을 더해야 한다.


$(A-B)\mod{M}=((A\mod{M})-(B\mod{M})+B)\mod{M}$


만약 M을 더하지 않아 $\mod{}$ 연산을 한 결과가 음수가 나오면 언어별로 다른 결과가 나온다.
예를 들어, $((6\mod{3})-(5\mod{3}))\mod{3}$의 결과가 C11, C++14, Java는 -2이고 Python3는 1이다.