나머지가 mm을 초과했는 지 검사Permalink

어떤 문제에서 구하려는 정답이 매우 커질 수 있어서 나머지 mm 으로 나눈값을 출력하라고 하는 문제는 흔하다.

하지만 그 정답이 mm 이상의 값이 되어서 나눠진건지 아니면 원래 mm 미만이라서 그 값인건지를 검사하는 것은 어떻게할까?

실제로 이런걸 물어보는 문제가 간혹 등장한다.

예를 들어, a+ba+b 를 구하고 있다고 하자.

바로 연산의 값이 modmod 이상이 나올 때, ka+b (mod m)k \equiv a+b~(mod~m) 을 만족하는 kk를 그대로 저장하는게 아니라 k+mk+m 을 저장하는 것이다.

그러면 한 번이라도 mm 값 이상이 된 적이 있는 값이라면 m2m1m\sim 2m-1 의 값을 담게 될 것이고, 그렇지 못한 값이라면 0m10 \sim m-1 의 값을 가지게 될 것이므로 구분이 된다.

예시 문제Permalink

BOJ 5954 - Dividing the Gold

일단 문제는 knapsack dp이다.

dp[i]=dp[i]= 합쳐서 ii 를 만드는 경우의 수 라고 할 때, dp[i]dp[i] 값이 0인지 아닌지가 중요한 문제이다.

왜냐면 iivi\sum_v - i 이 둘다 0이 아니여야 두 수를 만드는 방법이 모두 존재해 차이를 정답에 min 연산 해줄 수 있기 때문이다.

ii00이 아니면 당연히 vi0\sum_v -i \ne 0 이다.

그런데 여기서 나머지연산을 그대로 해버리면 1,000,0001,000,000이 딱 나왔을 때 그게 00으로 저장이 되어버려 문제를 올바르게 해결할 수 없다.

Tags:

Categories:

Updated:

Comments