vegatrash   4년 전

이 문제가 정말정말 어려워서 결국 풀이보고 알고리즘은 다 이해하기는 했는데

코드에서 뭔가를 빼는 값에 MOD연산을 해줄 때 마다 빼기 전에 MOD할 값을 한 번 더해줘야 하는 이유를 잘 모르겠습니다....

이 더해주는것을 생략하면 자꾸 틀린 풀이라고 하는데 혹시 왜 더해주어야 하는지 아시는 분 계신가요?

아래는  http://www.usaco.org/current/data/sol_spainting_gold_jan18.html에도 나와있는 코드랑 거의 같은거긴 하지만 첨부합니다.

보시면 45번째 줄이랑 47번째 줄에서 나머지 연산하기전에 한 번 더해주는데
47번쨰 줄에서 보면 (ans + MOD - (s[N] - s[N - 1])) % MOD 에서 진하게 표시한것처럼 한 번 더해주는것을 생략하면 틀리더라고요...

아 물론 a mod b == (a + b) mod b인건 알기는 하지만 저기서 MOD를 안더해주면 틀리는 이유가 뭘까요

jung2381187   4년 전

MOD를 안 더해주면 음수가 될 수 있는데, C/C++의 나머지 연산은 음수에 적용하면 우리가 흔히 아는 나머지 연산과는 좀 다른 방식으로 작동합니다. 그래서 MOD를 더해 음이 아닌 정수가 보장되도록 해야 합니다.

vegatrash   4년 전

그렇군요 감사합니다...

앞으로는 모듈로 하는 문제에서 뺄셈을 해야 할 일이 있으면 한 번 더해주는 습관을 들여야겠네요

sait2000   4년 전

사실 마지막에 한 번만 더해줘도 됩니다. b>0이면 -b < a % b < b이기 때문이죠.

vegatrash   4년 전

최근에 푸신분이시네요... 코드 보니 공식 답이랑 같은 알고리즘이신데 혹시 직접 떠올리신건가요??

풀이 이제 이해하기는 했는데, 도대체 이걸 어떻게 떠올린건지 신기하더라고요

sait2000   4년 전

네 dp로 풀면 된다고 들어서 고민해보다가 어떻게 풀었네요

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