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