모듈러 산술 연산(feat. 백준 10430번 나머지)

Kiwoong Park·2023년 4월 27일
0

백준 문제를 풀다가 모듈러 산술 연산의 분배법칙에 대해 알게되어 정리해보게 되었다.

문제
(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?
(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

C++ 코드

#include <iostream>
using namespace std;
int main(){
    int a,b,c;
    cin >> a >> b >> c;
    cout << (a+b)%c << "\n" << ((a%c) + (b%c))%c << "\n" << (a*b)%c << "\n" << ((a%c) * (b%c))%c;
}

당연히 풀이 자체는 그냥 간단한 산술 연산과 괄호만 잘 치면 된다.

문제에서 A+B나 A*B 수가 매우 큰 경우(오버플로우 발생할 수 있기 때문에)에 위와 같은 분배 법칙을 이용해서 수를 쪼개서 문제를 해결할 때 사용할 수 있다.

모듈러 연산 분배법칙의 간단한 증명

A=aM+b(M은나누는수,a는몫,b는나머지,0<=b<M)B=cM+d(M은나누는수,c는몫,d는나머지,0<=d<M)AA = aM+b (M은 나누는 수, a는 몫, b는 나머지, 0<=b<M) \\ B = cM+d (M은 나누는 수, c는 몫, d는 나머지, 0<=d<M) \\ A%M = b, B%M = d (A+B)%M = ((a+c)M+(b+d))%M = (b+d)%M = (A%M + B%M)%M (AxB)%M = (acM^2+(ad+bc)M+bd)%M = (bd)%M = (A%M x B%M)%M
profile
You matter, never give up

0개의 댓글

관련 채용 정보