NOIP2012Day2T1 explicar informes resolviendo la ecuación de congruencia y el euclidiano extendido

título Descripción

Buscando el número entero positivo más pequeño ax ≡ congruencia ecuación con respecto a la solución de x 1 (mod b).

Entrada y salida de formato de
entrada de formato:

Sólo una entrada de línea, que comprende dos números enteros positivos a, b, separadas por un espacio.

Los formatos de salida:

Sólo la línea de salida, que comprende un x0 número entero positivo, es decir, las soluciones menor entero positivo. Los datos de entrada garantizados solucionable.

entrada y salida de la muestra

Ejemplo de entrada # 1:
310

Muestra de salida # 1:
7

explicación

[Rango de datos]

Para 40% de los datos, 2 ≤b≤ 1000;

Para 60% de los datos, 2 ≤b≤ 50000000;

Para 100% de los datos, 2 ≤a, b≤ 2000000000.

NOIP 2012 para mejorar el grupo el día siguiente a la primera pregunta

Este es el objeto de una teoría de los números, la congruencia del concepto formal primero antes de decir lo mismo más adelante se ax≡kmod (b) su forma puede transformarse en - form> ax mod b = k como este. Con el lenguaje de la teoría de conjuntos, en sentido estricto es la siguiente:

Para cualquier subconjunto de un conjunto de números enteros Z, para cualquier elemento que pertenece a un n Z, n se divide por m, el número I puede obtenerse 0,1,2, ... m-1, un total de m tipos. Nos resto como un estándar de tamaño, Zm se divide en subconjuntos disjuntos m Z0, Z1, Z2, ... ZM-1.

Zi para cualquier par de elementos A, B, son aproximadamente los mismos I m. denotado

a≡b (m mod).
Se resuelve la ecuación de congruencia se puede utilizar en el euclidiano extendido
probablemente media es el siguiente

int E_gcd(int a,int b,int &x,int &y){
    int ret,temp;
    if(!b){
        x=1;y=0;
        return a;
    }
    ret=E_gcd(b,a%b,x,y);
    temp=x;
    x=y;
    y=temp-a/b*y;
    return ret;
}

Porque aquí queremos x, y sí pueden modificar para implementar el algoritmo en sí, por lo que cuando una definición de función para añadir su propio identificador de dirección de los cambios minuto a la x, los valores y.
Así que entender el algoritmo de Euclides después se extendió también a escribir el código en sí mismo

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;

int a,b,x,y;

inline int gcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int r=gcd(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-a/b*y;
    return r;
}

int main()
{
    scanf("%d%d",&a,&b);
    gcd(a,b,x,y);
    printf("%d",(x+b)%b);
turn 
0;
}

Debajo de nosotros, extendida euclidiana

contorno

algoritmo de Euclides conocido como algoritmo de Euclides para calcular los dos números enteros a, b máximo común divisor. Cálculo principio se basa en el siguiente teorema:

función se utiliza para encontrar la mayor gcd común divisor (a, b) de la.

Las propiedades básicas de la función mcd:

gcd (a, b) = mcd (b, a) = mcd (-a, b) = mcd (| a |, | b |)

expresiones de fórmulas

gcd (a, b) = mcd (b, a mod b)

Demostrar que: a se puede expresar como a = kb + r, entonces r = a mod b

Supongamos que d es un divisor común de a, b, y hay

d | a, d | b, y r = a - kb, por lo que d | r

D es, pues, (b, a mod b) del divisor

D se asume que (b, a mod b) del divisor, la

d | b, d | r, pero a = kb + r

D es por lo tanto (a, b) del divisor

Por lo tanto (a, b), y (b, a mod b) el divisor es el mismo, que es igual al máximo común divisor está obligado a dar pruebas
idioma

int gcd(int a,int b){
return b?gcd(b,a%b):a;
}

algoritmo de expansión

Para entero no negativo incompleta 0 a, b, GCD (a, b) representa a, b máximo común divisor necesariamente
números enteros de x, y, de tal manera que gcd (a, b) = ax + by.
idioma

int gcd(int a,int b,int &x,int &y){
if (b==0){
x=1,y=0;
return a;
}
int q=gcd(b,a%b,y,x);
y-=a/b*x;
return q;
}

Entiende que el método de resolución de la x, y de

Proporcionado a> b.

1, obviamente, cuando b = 0, gcd (a, b) = a. En este momento, x = 1, y = 0;

2, a> b> 0 时

Proporcionada AX1 + by1 = gcd (a, b);

bx2 + (a mod b) y2 = mcd (b, a mod b);

Hay gcd (a, b) = mcd (b, a mod b) de acuerdo con el principio de la sencilla euclidiana;

Entonces: AX1 + by1 = bx2 + (a mod b) y2;

即: AX1 + by1 = bx2 + (a - [a / b] * b) y2 = ay2 + bx2- [a / b] * by2;

Es decir AX1 + by1 == ay2 + b (x2- [a / b] * y2);

El teorema de identidad: x1 = y2; y1 = X2- [a / b] * y2;

Así llegamos a resolver x1, y1 método: x1, y1 x2 valor basado, y2.

La idea anterior se define de forma recursiva, porque gcd solución constantemente recursiva habrá un momento en que b = 0, por lo que la recursión puede terminar.

algoritmo de Euclides extendido

algoritmo de Euclides extendido se utiliza en el conocido a, b la solución de un conjunto de x, y tal que ax + by = mcd (a, b) = d (debe ser soluciones, teoremas de acuerdo con la teoría de números). El molde euclidiano extendido utiliza en la solución de ecuaciones lineales y ecuaciones. implementación:

int exGcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int r=exGcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
return r;
}
Este recursiva aplicación y realización Gcd comparó y se encontró más de los siguientes x, proceso de asignación y, la esencia de los cuales es el algoritmo de Euclides extendido.

Esa forma de pensar puede ser:

Para un '= b, b' = Para un% de B, encontramos x, y tales A'x + B'y = mcd (a 'b')

Como b '= a% b = aa / b * b (Nota: en donde / es una división del lenguaje de programación)

Usted puede obtener:

A'x + B'y = mcd (a 'b') ===>

bx + (a - a / b * b) y = mcd (a 'b') = mcd (a, b) ===>

ay + b (x - a / b * y) = mcd (a, b)

Así, para A y B, que corresponden a p, q e y son (xa / b * y)

Utilizar el algoritmo de Euclides extendido a resolver enfoque ecuación indeterminada

ecuación indefinida para pa número entero + qb = c, si c mod Gcd (a, b) = 0, la solución de la ecuación existe números enteros, números enteros o solución.

No es un tipo de una manera más rigurosa para probar, pero por lo menos hacer un poco de espacio en blanco, espero que algún número de la teoría gurú modificaciones adicionales:

Puesto que sabemos, no existe un conjunto de x e y de tal manera que a * x + b * y = gcd (a, b).

Simultáneamente multiplicando la ecuación a ambos lados de un entero k, es decir, a * x * k + b * y * k = gcd (a, b) * k. Si c mod gcd (a, b) = f, a continuación, 0 <= f

Publicado 41 artículos originales · ganado elogios 58 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/a1351937368/article/details/77660946
Recomendado
Clasificación