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