Просьба объяснить как сделать такую операцию : требуется найти (t^(ak)-1)/(t^a-1) по некоторому простому модулю (t- некоторая константа) Помогите пожалуйста разобраться, либо ссылочку, где можно почитать Просто я раскладывал в ряд t^(a(k-i)) где 1<=i<=k, но работает долго
Если ta ≠ 1 (mod p) (где p — модуль), то можно быстрым возведением в степень посчитать числитель и знаменатель дроби, им же найти обратный к знаменателю (пользуясь теоремой Ферма/Эйлера: ap - 2·a = 1 (mod p) и перемножить.
То, что выше описал Егор, не будет работать, если t не взаимно просто с p. Однако можно решить эту задачу и в таком случае, не пользуясь никакими делениями. Если не ошибаюсь, это была задача на одном из первых раундов последних SNWS.
.
Заметим, что если k чётно, то . Иначе можно посчитать просто: f(k) = ta·f(k - 1) + 1. За логарифмическое число шагов таким образом мы вычислим требуемую сумму.
В текущей версии решение работает за O(log2k) (на каждом шаге может понадобиться вызывать быстрое возведение в степень). Но можно аккуратно написать и просто пересчитывать выражение в скобках mdash; тогда сложность выйдет вообще O(logk).
Вот почему плохо сильно править комментарии :D
А, модуль-то простой. На том раунде не было условия, что модуль простой — тогда если нам не повезло и t не взаимно просто с p, то подобное заключение не спасает и нужно шагать, удваивая количество слагаемых в этой сумме, как я описал выше.
OMG )