Advertisement
vkazar

Untitled

Sep 28th, 2023
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.35 KB | None | 0 0
  1. package sprint4.tasks.A
  2.  
  3. fun main() {
  4.     val a = readln().toInt()
  5.     val m = readln().toInt()
  6.     readln().polynomialHash(a, m).let(::println)
  7. }
  8.  
  9. fun String.polynomialHash(a: Int, m: Int): Int {
  10.     // можно воспользоваться свойствами остатка от деления:
  11.     // (a+b)%c = (a%c + b%c)%c
  12.     // (a*b)%c = ((a%c) * (b%c))%c
  13.     // по первому свойству можно сумму разложить на сумму остатков
  14.     // каждое слагаемое -- произведение, тоже можно разложить
  15.     // второй множитель -- это степень а
  16.     // (a*a)%n = ((a%n)*(a%n))%n
  17.     // то есть хранить a в изначальном виде не нужно, можно хранить a%n
  18.     val a = a % m
  19.     // сумма изначально пустая
  20.     var res = 0
  21.     // т.к. в цикле идём задом наперёд, то и степень начинается с нулевой
  22.     var pow = 1
  23.  
  24.     // в цикле перебираем строку от последнего символа до первого
  25.     for (i in lastIndex downTo 0) {
  26.         // пользуясь разложением остатка от суммы, раскладываем:
  27.         // res -- накопленный итог как остаток от деления
  28.         // ((this[i].code % m) * pow) % m -- второе слагаемое
  29.         // состоит из this[i].code % m, умноженного на степень
  30.         // но степень уже с взятым остатком, поэтому его ещё раз не считаем
  31.         // и в конце берём остаток от деления второго слагаемого
  32.         // а потом и всей суммы и записываем в накопленный итог
  33.         res = (res + ((this[i].code % m) * pow) % m) % m
  34.         // после того как произвели вычисления, надо увеличить степень
  35.         // и pow, и a -- остатки от деления, поэтому их самих не делим, только их произведение
  36.         pow = (pow * a) % m
  37.     }
  38.     // res хранит в себе накопленный итог
  39.     return res
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement