Теорема об остатках в Китае говорит нам, что мы всегда можем найти число, которое дает любые необходимые остатки при различных простых модулях. Ваша цель - написать код для вывода такого числа за полиномиальное время. Самый короткий код выигрывает.
Например, скажем, мы получили эти ограничения ( %представляет мод):
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