위 식에서 r의 값은 31로 하고 M의 값은 1234567891 로 정한다.
N을 입력 받고 N의 길이만큼 문자열을 입력받는다.
예시
5
abcde
abcde의 해시 값은 1 × 31^0 + 2 × 31^1 + 3 × 31^2 + 4 × 31^3 + 5 × 31^4 = 1 + 62 + 2883 + 119164 + 4617605 = 4739715이다.
이런 문제는 처음 봤다ㅋㅋㅋㅋ🤣
import sys
import math
n = int(sys.stdin.readline())
a = sys.stdin.readline().rstrip()
result = 0
for i in range(len(a)):
k = ord(a[i]) - ord('a') + 1
result += k * math.pow(31,i)
print(int(result) % 1234567891)
알아보니 math.pow 함수는 수가 커지면 오차가 발생한다고 한다.
import sys
n = int(sys.stdin.readline())
a = sys.stdin.readline().rstrip()
result = 0
for i in range(len(a)):
k = ord(a[i]) - ord('a') + 1
result += k * (31 ** i)
print(int(result) % 1234567891)
그래서 math.pow 부분을 바꿔주니 다행히 100점이 나왔다.
이산수학 과제할 때마다 math.pow() 를 아주 유용하게 썼는데 이렇게 배신을 당하다니...😪😪😪😪😪