Что значит "вывести число по модулю"?
Не понял условие задачи:
Выведите искомое число по модулю (109 + 9).
Объясните или укажите ссылку на ресурс, который объясняет простым языком данное условие. В интернете написано очень сложно.
Ответы (1 шт):
Ответ состоит из двух простых частей:
"по модулю" нужно понимать просто как "остаток от деления": значенние "37 по модулю 25" означает 37%25, то есть 12.
Зачем вообще так спрашивают: в некотoрых задачах числа, которые возникают, не помещаются ни в один из арифметических форматов без переполнения. А для проверки правильности ответа - достаточно не ответа, а просто части ответа, остатка от деления ответа на какое то большое (в подавляющем числе случаев - простое) число. Таким типичным числом является "десять в девятой плюс девять" - позволяет избежать переполнения, и умещается в int32
Маленькое дополнение:
Как отметил Harry в комментариях - число 1000000009 (десять в девятой плюс девять), так же, как и число 1000000007 - это простые числа.
Это приводит к тому, что для основных арифметических операций "то равенство, которое получится при обычной операции над числами, будет выполняться и для остатков по модулю".
То есть, при простом p
(a + b) (mod p) == a(mod p) + b(mod p)
(a - b) (mod p) == a(mod p) - b(mod p)
(a * b) (mod p) == a(mod p) * b(mod p)
(a / b) (mod p) == a(mod p) / b(mod p), что следует понимать так:
возьмем пример Harry: (51/17) (mod 5) == 51 (mod 5) / 17 (mod 5) == (51/17) (mod 5) == 1 / 2,
так как ((2*51)/17)(mod 5) == 1 (mod 5),
так как (251)(mod 5) == (117) (mod 5),
так как 2 == 2
последнее утверждение написано по мотивам замечания Harry.
Поэтому вместо проверки "равенства ответа некоторому числу" можно проверять "равенство ответа по модулю силу по модулю".
При этом возможны коллизии, но для возникновения коллизии Вы долны ошибится в ответе на число, кратное p.