알고리즘

[BOJ 26008] 해시 해킹

dldyou 2024. 3. 24. 20:26

h(P)=(P0×A0+P1×A1++PN1×AN1) mod Mh(P)=(P0×A0+P1×A1++PN1×AN1) mod M 에서 P0×A0+P1×A1++PN1×AN1P0×A0+P1×A1++PN1×AN1의 형태는 마치 AA진법의 형태와 같다.

 

이러한 형태에서 Pi<AiPi<Ai라면 P0×A0+P1×A1++PN1×AN1P0×A0+P1×A1++PN1×AN1는 고유한(중복되지 않는) 값을 가질 것이다. 하지만 이는 문제와 크게 관련이 없으니 넘어가도록 하자.

 

위의 식을 조금 정리해 보자. 

h(P)=(P0×A0+P1×A1++PN1×AN1) mod Mh(P)=(P0×A0+P1×A1++PN1×AN1) mod M에서 P0×A0P0×A0P0P0이다. 문제에서 주어지는 AA와 관련 없이 상수가 된다. 

 

h(P)=(P0+P1×A1++PN1×AN1) mod Mh(P)=(P0+P1×A1++PN1×AN1) mod M 에서 P1×A1++PN1×AN1P1×A1++PN1×AN1 부분을 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)=(0M1+0M1) mod Mh(P)=(0M1+0M1) mod M가 되므로 KK가 어떠한 값이 되더라도 P0P0값을 임의로 정하여 h(P)h(P)의 값이 HH가 되도록 정할 수 있다. P0P0값은 MM 이상이 아니므로 어느 HH에 대해 KK가 정해졌을 때, 단 하나의 P0P0값만 HH를 만들 수 있다. 

 

결국, KK의 경우의 수를 세어주면, 그것이 HH를 만들 수 있는 경우의 수가 되는 것이다. MN1MN1109+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