h(P)=(P0×A0+P1×A1+⋯+PN−1×AN−1) mod Mh(P)=(P0×A0+P1×A1+⋯+PN−1×AN−1) mod M 에서 P0×A0+P1×A1+⋯+PN−1×AN−1P0×A0+P1×A1+⋯+PN−1×AN−1의 형태는 마치 AA진법의 형태와 같다.
이러한 형태에서 Pi<AiPi<Ai라면 P0×A0+P1×A1+⋯+PN−1×AN−1P0×A0+P1×A1+⋯+PN−1×AN−1는 고유한(중복되지 않는) 값을 가질 것이다. 하지만 이는 문제와 크게 관련이 없으니 넘어가도록 하자.
위의 식을 조금 정리해 보자.
h(P)=(P0×A0+P1×A1+⋯+PN−1×AN−1) mod Mh(P)=(P0×A0+P1×A1+⋯+PN−1×AN−1) mod M에서 P0×A0P0×A0는 P0P0이다. 문제에서 주어지는 AA와 관련 없이 상수가 된다.
h(P)=(P0+P1×A1+⋯+PN−1×AN−1) mod Mh(P)=(P0+P1×A1+⋯+PN−1×AN−1) mod M 에서 P1×A1+⋯+PN−1×AN−1P1×A1+⋯+PN−1×AN−1 부분을 KK로 놓자.
h(P)=(P0+K) mod Mh(P)=(P0+K) mod M으로 정리를 할 수 있다.
모듈러 연산에 의해 h(P)=(P0 mod M+K mod M) mod Mh(P)=(P0 mod M+K mod M) mod M으로 나타낼 수 있다.
h(P)=(0∼M−1+0∼M−1) mod Mh(P)=(0∼M−1+0∼M−1) mod M가 되므로 KK가 어떠한 값이 되더라도 P0P0값을 임의로 정하여 h(P)h(P)의 값이 HH가 되도록 정할 수 있다. P0P0값은 MM 이상이 아니므로 어느 HH에 대해 KK가 정해졌을 때, 단 하나의 P0P0값만 HH를 만들 수 있다.
결국, KK의 경우의 수를 세어주면, 그것이 HH를 만들 수 있는 경우의 수가 되는 것이다. MN−1MN−1을 109+7109+7로 나눈 나머지를 출력해 주면 된다.
'알고리즘' 카테고리의 다른 글
[BOJ 2806] DNA 발견 (0) | 2024.03.25 |
---|---|
[BOJ 27966] △ (0) | 2024.03.25 |
[BOJ 11899] 괄호 끼워넣기 (1) | 2024.03.22 |
[BOJ 2036] 수열의 점수 (0) | 2024.03.19 |
[BOJ 7795] 먹을 것인가 먹힐 것인가 (0) | 2024.03.19 |