Teoría de los números - Teorema Shu Pei

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 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/2462478392Lee/p/12459710.html
Recomendado
Clasificación