Shu Pei Teorema
Ajuste a, b es un entero de no todos ceros, entonces los enteros X, Y , de manera que X + B * * A Y = mcd (a, b) .
prueba ligeramente
solicitud
Da a los n tarjetas, respectivamente, li y CI . En un tiempo infinitamente largo cinta, puede elegir para pasar ci dinero para comprar la tarjeta i , a continuación, a la izquierda o puede ir li correctas unidades. Pide la cantidad de dólares que gasta al menos será capaz de saltar todas las posiciones en la cinta. Si no, la salida de -1 .
resolución:
Análisis del problema, consideremos el caso de dos números y se encontró que desea saltar en cada cuadrícula, tenemos que hacer estos números varias veces mediante la adición o derivados mediante la adición del valor absoluto de 1 , y luego pensó en Shu Pei teorema.
La liberación puede ser: si un y b son relativamente primos, entonces debe haber dos enteros x e Y , de manera que por = 1 + AX. .
Se deduce que si se obtiene el número de la tarjeta seleccionada varias veces por adición o sustracción de un valor absoluto de 1 , entonces la constante de número primo, este tiempo puede ser considerada para la solución de programación dinámica.
Pero las ideas se pueden transferir, ya que estos números primos, 0 es el número de nodos que comienzan, cada paso requiere mcd (número de nodo, el siguiente nodo), mientras que registra el costo, se convirtió desde 0 a través mcd continua , finalmente, se convierte en un mínimo precio.
Desde:. Prime es el mayor factor común 1 , GCD (0, X) = X estos dos teoremas, el algoritmo puede ser probado correcto. Seleccione la optimización de cola de prioridad Dijkstra resuelto.
Pero hay un problema, es decir, si la necesidad de registrar ya ha comprado una tarjeta, tag de matriz abierta debido a que los datos de alcance de hasta 10 ^ 9 excedería el límite de memoria, es concebible que el uso unordered_map
# include <cstdio> #include <cstring> #include <algoritmo> #include <math> #include <mapa> #include <cola> #include < string > #include <iostream> #include <pila> #define ll mucho, mucho #define inf 0x3f3f3f3f plantilla < clase T> inline void gmax (T & a, T b) { si (b> a) a = b;} plantilla < clase T> inline void gmin (T & a, T b) { si (b <a) a = b;} el uso de espacio de nombres std; const int N = 303 , M = 0 , Z = 1e9 + 7 , MAXINT = 2147483647 , MS31 = 522133279 , MS63 = 1061109567 , ms127 = 2139062143 ; const dobles eps = 1E- 8 , PI = Acos (- 1,0 ); // 0,0 mapa < int , int > MOP; mapa < int , int > :: iterador ella; int l [N], c [N]; int n; int gcd (int x, int y) { int z; mientras que (y) { z = x% y; x = y; y = z; } Retorno x; } Int main () { mientras que (~ scanf ( " % d " , y n)) { mop.clear (); para ( int i = 1 ; i <= n; i ++) scanf ( " % d " , y l [i]); para ( inti = 1 ; i <= n; i ++) scanf ( " % d " , y c [i]); para ( int i = 1 ; i <= n; i ++ ) { para (IT = mop.begin (); it = mop.end ();! que ++ ) { int x = IT-> primero; int y = IT-> segundos; int g = gcd (l [i], x); si (mop.find (g) == mop.end ()) RP [g] = y + c [i]; más gmin (MOP [g], y + c [i]); } Si (mop.find (l [i]) == mop.end ()) RP [l [i]] =c [i]; más gmin (MOP [l [i]], c [i]); } Si (mop.find ( 1 ) == mop.end ()) printf ( " -1 \ n " ); más printf ( " % d \ n " , la fregona [ 1 ]); } Volver 0 ; }