Cerința
Se dau două șiruri de câte N numere fiecare. Se cere să se găsească valoarea maximă a celui mai mare divizor comun a două numere A și B, astfel încât A să aparțină primului șir, iar B să aparțină celui de-al doilea șir.
Date de intrare
În fișierul gcd.in se va afla pe prima linie un număr reprezentând valoarea lui N. Pe cea de-a doua linie se vor afla N numere separate prin câte un spațiu, reprezentând elementele primului șir. Pe cea de-a treia linie se vor afla N numere separate prin câte un spațiu, reprezentând elementele celui de-al doilea șir.
Date de ieșire
În fișierul gcd.out se va afla pe primia linie un număr natural reprezentând valoarea maximă a celui mai mare divizor comun a două numere A și B, astfel încât A să aparțină primului șir, iar B să aparțină celui de-al doilea șir.
Restricții și precizări
N<=500.000- Elementele celor două șiruri <=
1.000.000 - Pentru 40% din teste,
N<=1.000
Exemplu
gcd.in
5 3 1 4 2 8 5 2 12 8 3
gcd.out
8
Explicație
A = 8, B = 8, iar (A,B) = 8 este valoarea maximă a celui mai mare divizor comun a vreunei perechi.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("gcd.in");
ofstream cout("gcd.out");
int n , a[1000001] , b[1000001] , c , maxi , x[1000001] , y[1000001];
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; ++i)
{
cin >> c;
a[c]++;
if(c > maxi) maxi = c;
}
for(int i = 1 ; i <= n ; ++i)
{
cin >> c;
b[c]++;
if(c > maxi) maxi = c;
}
for(int i = 1 ; i <= maxi ; ++i)
for(int j = i ; j <= maxi ; j += i)
{
if(a[j] != 0) x[i] = max(x[i] , j);
if(b[j] != 0) y[i] = max(y[i] , j);
}
int ok = 0;
for(int i = maxi ; i >= 0 ; --i)
if(x[i]&&y[i]) break;
else ok++;
cout << maxi - ok;
return 0;
}