Primeiro, o algoritmo de Euclides e sua prova
1. Definições:
algoritmo de Euclides conhecido como algoritmo de Euclides, um divisor comum maior de dois números, calculado como GCD (a, b) = GCD (b, a% b);
2. A prova:
X é um número inteiro de dois conjuntos de um, b (a> = b), o maior divisor comum, então x | um, x | b;
① divisão por um transitória (se divisível x a, x b divisível, então x é divisível a, b combinação linear arbitrária) da conhecidos x | ab &;
② b x factor não é fornecido, então x ab e b não são factores comuns, em que x não é um factor, então x ab e b não são factores comuns, pode ser derivada GCD (a, b) = GCD (b, ab);
③> = b é conhecido a partir de um, um pode ser expressa como a = b * q + r; q é subtraído um número restante é o b-r, de modo GCD (a, b) = GCD (b, a% b );
3. Código Geral:
(1) forma recursiva:
int gcd(int a,int b){return b?gcd(b,a%b):a;}
(2) forma iterativa:
int gcd(int a,int b){
for(;;) {
if(b==0)return a;
int temp=a%b;
a=b;
b=temp;
}
}
4. Várias propriedades:
(1) Quando o GCD (a, b) = 1, então a, b duas número primo.
(2) GCD (a, 2a) = a;
(3) GCD (a, 0) = a;
(4) GCD (a, b) = GCD (-a, b) = GCD (a, -b) = GCD (-a, -b);
o LCM (A, B) (5.) GCD (A, B) = A B (LCM é um múltiplo comum do número dois);
(6) GCD (n, n + 1) = 1;
prova:
Supondo que eles não são primos entre si, um fator comum q
n = p1 * 1, n + 1 = P2 * q; n + 1 - N = q (p2 - p1)
Em seguida, q (P2-P1) = 1, em que P2, P1 são números inteiros, q> = 2, que variam de licença. Provado.
Em segundo lugar, tópicos relacionados
1. [Luo Gu P1372] é graduação temporada eu
Descrição
O professor queria destacar os maiores indivíduos envolvidos em compreender a extensão k vestido de festa de formatura ensaio. Mas como escolher isso? O professor listados a classe do número 1, 2, ......, n, k e creio compreender a extensão do indivíduo é o seu maior divisor comum (isto não é uma superstição oh). Isso pode ser difícil para ele, por favor, ajudem! PS: um número que é o maior divisor comum em si.
Formato de entrada: dois inteiros n e k positivos separados por espaços. (N> = k> = 1)
formato de saída: um número inteiro, o valor máximo de compreensão.
Solução
1. Nota: "o maior divisor comum de um número que em si é": podemos considerar a natureza (2): Quando o número é um múltiplo de dois, o maior divisor comum do número que é menor, então o outro caso opostas da mesma faixa a combinação destes dois número relativamente grande do maior divisor comum.
2. Na discussão de alguns casos especiais: quando k = 1, n = ans; k = 2, se n for mesmo, a ans = n / 2, se n for ímpar, ANS = (n-1) / 2 ;
3. Descobrimos que a discussão acima: satisfazer k * a <n, o valor máximo de um é a resposta. Isto é, as figuras foram seleccionados um, 2a, 3a, ......, ka, de modo que a resposta é a / b;
Código
#include <iostream> usando namespace std; int main () { int a, b; cin >> >> uma b; cout << a / b << " \ n " ; retornar 0 ; }
2. [Luo Gu P1170] Pernalonga eo Caçador
Descrição
Bugs Bunny esconderijo no pomar ao lado do bosque. árvores de pomar N x m, constituídas por uma matriz de filas e colunas M N, horizontalmente ou verticalmente adjacente a uma distância de duas árvores. Pernalonga em menos de uma árvore frutífera. Hunter carregando uma espingarda para o pomar, ele escalou uma árvore de fruta, pronto para matar Bugs Bunny. Se há outras árvores frutíferas entre Hunter e Pernalonga, os caçadores podem ver Bugs Bunny. caçadores agora conhecidos e Bugs Bunny localização, localização procedimentos escritos para determinar onde o coelho é seguro.
Formato de entrada: primeira linha n, expressa n (n ≤ 100.000) conjuntos de dados, cada dados dos dois primeiros atos de machado inteiros positivos e ay, indicando a posição do caçador, uma segunda bx comportamento e por dois inteiros positivos, erros representa uma posição (1 ≤ ax, Ay, bx, por ≤ 100000000).
Formato de Saída: Um total de n linhas, cada comportamento "sim" ou "não" Erros expressas posição do coelho é seguro.
Solução
1. Depois de ler o título, podemos simplificar o tópico: se há mais coordenadas inteiro estão buscando dois pontos sobre o inteiro ponto de coordenadas determinada linha reta entre dois pontos;
2. Podemos, então, coordenadas Hunter como a origem do sistema de coordenadas é estabelecida, desde o caçador (x1, y1), coelho (x2, y2), então nós mudamos a coordenadas de coelho (x2-x1, y2-y1);
3. Assim como você determinar que nenhum outro coordenadas ponto inteiro entre a origem eo ponto de ele? Ao desenhar podemos encontrar, enquanto as coordenadas do ponto em que é relativamente primos para satisfazer as necessidades, pela natureza do (1) é equivalente ao GCD conhecido (x, y) = 1;
4. Sabemos que pela natureza do (4), dois números símbolo do mesmo não afeta o número de coordenadas tomando o valor absoluto do maior divisor comum de modo recálculo;
5. Note que essa pluralidade problema de conjuntos de dados;
Código
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;} //GCD;
int main(){
int n,x1,x2,y1,y2,i,j,k;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2&&y1==y2){ //特判,两者坐标重合时,GCD=0,而兔子有危险;
printf("no\n");
continue;
}
x2=abs(x2-x1);
y2=abs(y2-y1);
if(gcd(x2,y2)==1)printf("no\n");
else printf("yes\n");
}
return 0;
}
3. [Luo Gu P2651] adicionam parentesis III
Descrição
Agora dá uma expressão da forma A1 / A2 / A3 /.../ um; calculado se directamente, isto é, com excepção da última, tal como 1/2/1/4 = 1/8. Uma fração pequena, no entanto ver um sentimento muito desconfortável, eu espero adicionar alguns suportes de modo que se torna um inteiro. Uma abordagem possível é a (02/01) / (1/4) = 2. Agora dado esta expressão, para perguntar se você pode torná-lo um inteiro adicionando alguns parênteses para alterar a ordem das operações.
Formatos de entrada: um ponto de teste, haverá múltiplas expressões. A primeira linha de t, indica o número de expressões. Para cada expressão, uma primeira fila é N, o número de segunda linha n, indica o i-ésimo ai.
formato de saída: linhas de saída t. Para cada expressão, se você pode fazê-lo em um inteiro, adicionando parênteses para alterar a ordem, então a saída "Sim", caso contrário, um "Não"
Solução
1. Podemos ver que, a fim de tornar os resultados como um número inteiro, devemos minimizar os máximo denominador, moléculas;
2.那么我们发现,a2无论如何都是在分母上的,那么我们这样添加括号即可:a1/(a2/a3/.../an)=a1a3...*an/a2,此时满足分母最大,分子最小;
3.那么我们需要进行约分:对每一个分子都和分母求一次GCD,每次求后令分母除以GCD,到最后一项时若分母=1,则结果为整数;
4.注意本题有多组数据;
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;} //GCD
int main(){
int t,n,i,j;
scanf("%d",&t);
for(i=1;i<=t;++i){
scanf("%d",&n);
int a[n+1]={};
for(j=1;j<=n;++j) scanf("%d",&a[j]);
a[2]/=gcd(a[1],a[2]);
for(j=3;j<=n;++j) a[2]/=gcd(a[2],a[j]);
if(a[2]==1)printf("Yes\n");
else printf("No\n");
}
return 0;
}