le théorème des restes chinois nous dit que nous pouvons toujours trouver un nombre qui produit tous les restes requis sous différents modules premiers. Votre objectif est d'écrire du code pour sortir un tel nombre en temps polynomial. Le code le plus court gagne.
Par exemple, supposons qu'on nous donne ces contraintes ( %
représente le mod):
n % 7 == 2
n % 5 == 4
n % 11 == 0
Une solution est n=44
. La première contrainte est satisfaite parce que 44 = 6*7 + 2
, et il en 44
est de même pour le reste 2
divisé par 7
, et donc 44 % 7 == 2
. Les deux autres contraintes sont également respectées. Il existe d'autres solutions, telles que n=814
et n=-341
.
Contribution
Une liste de paires non vide (p_i,a_i)
, où chaque module p_i
est un nombre premier distinct et chaque cible a_i
est un nombre naturel dans la plage 0 <= a_i < p_i
. Vous pouvez prendre des informations sous la forme qui vous convient; il n'est pas nécessaire que ce soit une liste de paires. Vous ne pouvez pas supposer que l'entrée est triée.
Production
Un entier n
tel que n % p_i == a_i
pour chaque index i
. Il n'est pas nécessaire que cette valeur soit la plus petite et peut être négative.
Restriction temporelle polynomiale
Pour éviter des solutions bon marché qui tentent simplement n=0
, n=1
, n=2
et ainsi de suite, votre code doit être exécuté en temps polynomial dans la longueur de l'entrée . Notez qu'un nombre m
dans l'entrée a une longueur Θ(log m)
, donc m
lui-même n'est pas polynomial dans sa longueur. Cela signifie que vous ne pouvez pas compter m
ou effectuer une opération m
, mais vous pouvez calculer des opérations arithmétiques sur les valeurs.
Vous ne pouvez pas utiliser un format d'entrée inefficace comme unaire pour contourner ce problème.
Autres interdictions
Les fonctions intégrées permettant d'effectuer les opérations suivantes ne sont pas autorisées: implémenter le théorème du reste chinois, résoudre des équations ou des nombres de facteurs.
Vous pouvez utiliser des fonctions intégrées pour trouver des mods et effectuer des additions, des soustractions, des multiplications et des exponentiations modulaires (avec un exposant de nombres naturels). Vous ne pouvez pas utiliser d'autres opérations modulaires intégrées, notamment l'inverse modulaire, la division et la recherche d'ordres.
Cas de test
Ceux-ci donnent la plus petite solution non négative. Votre réponse peut être différente. Il est probablement préférable de vérifier directement que votre sortie satisfait à chaque contrainte.
[(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