Il teorema del resto cinese ci dice che possiamo sempre trovare un numero che produce i resti necessari sotto diversi moduli primi. Il tuo obiettivo è scrivere codice per generare un numero simile in tempo polinomiale. Il codice più corto vince.
Ad esempio, supponiamo che ci vengano dati questi vincoli ( %
rappresenta mod):
n % 7 == 2
n % 5 == 4
n % 11 == 0
Una soluzione è n=44
. Il primo vincolo è soddisfatto perché 44 = 6*7 + 2
, e così 44
ha resto 2
quando diviso per 7
, e quindi 44 % 7 == 2
. Anche gli altri due vincoli sono soddisfatti. Esistono altre soluzioni, come n=814
e n=-341
.
Ingresso
Un elenco non vuoto di coppie (p_i,a_i)
, in cui ciascun modulo p_i
è un primo distinto e ogni target a_i
è un numero naturale nell'intervallo 0 <= a_i < p_i
. Puoi prendere input in qualunque forma sia conveniente; non deve essere in realtà un elenco di coppie. Non si può presumere che l'input sia ordinato.
Produzione
Un numero intero n
tale n % p_i == a_i
per ciascun indice i
. Non deve essere il valore più piccolo, e può essere negativo.
Limitazione temporale polinomiale
Per evitare che le soluzioni a basso costo che cercano solo n=0
, n=1
, n=2
, e così via, il codice deve essere eseguito in tempo polinomiale nella lunghezza dell'input . Si noti che un numero m
nell'input ha lunghezza Θ(log m)
, quindi di per m
sé non è polinomiale nella sua lunghezza. Ciò significa che non è possibile contare m
o eseguire i m
tempi di un'operazione , ma è possibile calcolare le operazioni aritmetiche sui valori.
Non puoi usare un formato di input inefficiente come unario per aggirare questo.
Altri divieti
Gli incorporamenti per eseguire le seguenti operazioni non sono consentiti: implementare il teorema del resto cinese, risolvere equazioni o numeri di fattori.
Puoi usare i built-in per trovare mod ed eseguire addizioni, sottrazioni, moltiplicazioni ed esponenziali modulari (con esponente di numero naturale). Non è possibile utilizzare altre operazioni modulari integrate, tra cui inversa, divisione e ricerca di ordini modulari.
Casi test
Questi forniscono la più piccola soluzione non negativa. La tua risposta potrebbe essere diversa. Probabilmente è meglio se controlli direttamente che l'output soddisfi ogni vincolo.
[(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