Теорема об остатках в Китае говорит нам, что мы всегда можем найти число, которое дает любые необходимые остатки при различных простых модулях. Ваша цель - написать код для вывода такого числа за полиномиальное время. Самый короткий код выигрывает.
Например, скажем, мы получили эти ограничения ( %
представляет мод):
n % 7 == 2
n % 5 == 4
n % 11 == 0
Одним из решений является n=44
. Первое ограничение выполняется потому 44 = 6*7 + 2
, что и так 44
имеет остаток 2
при делении на 7
, и, таким образом 44 % 7 == 2
. Два других ограничения также выполнены. Существуют и другие решения, такие как n=814
и n=-341
.
вход
Непустой список пар (p_i,a_i)
, где каждый модуль p_i
представляет собой отдельное простое число, а каждая цель a_i
- натуральное число в диапазоне 0 <= a_i < p_i
. Вы можете принять участие в любой удобной форме; это не обязательно должен быть список пар. Вы не можете предполагать, что вход отсортирован.
Выход
Целое число n
такое, что n % p_i == a_i
для каждого индекса i
. Это не должно быть наименьшее такое значение, и может быть отрицательным.
Полиномиальное ограничение по времени
Чтобы предотвратить дешевые решения , которые просто пытаются n=0
, n=1
, n=2
и так далее, ваш код должен работать в полиномиальное время в длине ввода . Обратите внимание, что число m
во входных данных имеет длину Θ(log m)
, поэтому m
само по себе оно не является полиномиальным по своей длине. Это означает, что вы не можете рассчитывать m
или выполнять время операции m
, но вы можете вычислять арифметические операции над значениями.
Вы не можете использовать неэффективный формат ввода, такой как унарный, чтобы обойти это.
Другие запреты
Не допускаются встроенные функции для выполнения следующих действий: Реализация теоремы китайского остатка, решение уравнений или факторных чисел.
Вы можете использовать встроенные модули для поиска модов и выполнения модульного сложения, вычитания, умножения и возведения в степень (с показателем натурального числа). Вы не можете использовать другие встроенные модульные операции, включая модульное обратное, деление и поиск заказа.
Контрольные примеры
Они дают наименьшее неотрицательное решение. Ваш ответ может быть другим. Вероятно, лучше, если вы прямо проверите, что ваш вывод удовлетворяет каждому ограничению.
[(5, 3)]
3
[(7, 2), (5, 4), (11, 0)]
44
[(5, 1), (73, 4), (59, 30), (701, 53), (139, 112)]
1770977011
[(982451653, 778102454), (452930477, 133039003)]
68121500720666070