2296 - gcd

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

Se dau două șiruri de câte N numere naturale 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 gcdin.txt 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 gcdout.txt 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 sunt mai mici sau egale cu 1.000.000

Exemplul 1

Intrare
gcdin.txt
5
3 1 4 2 8
5 2 12 8 3
Ieșire
Datele de intrare corespund restricțiilor impuse
gcdout.txt
8

Explicație

A = 8, B = 8, iar (A,B) = 8 este valoarea maximă a celui mai mare divizor comun a vreunei perechi.

Exemplul 2

Intrare
gcdin.txt
500001
3 1 4 2 8
5 2 12 8 3
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#2296 - GCD

import math


def validare_date(n, sir1, sir2):
    if not 1 <= n <= 500000:
        return False
    if any(not 1 <= x <= 1000000 for x in sir1 + sir2):
        return False
    return True


def gcd_maxim(sir1, sir2):
    gcd_max = 0
    for a in sir1:
        for b in sir2:
            gcd_max = max(gcd_max, math.gcd(a, b))
    return gcd_max


# Citire date de intrare
with open('gcdin.txt', 'r') as f:
    n = int(f.readline())
    sir1 = list(map(int, f.readline().split()))
    sir2 = list(map(int, f.readline().split()))

# Validare date de intrare
if validare_date(n, sir1, sir2):
    print("Datele de intrare corespund restricțiilor impuse")
    # Calcul și afișare rezultat
    rezultat = gcd_maxim(sir1, sir2)
    with open('gcdout.txt', 'w') as f:
        f.write(str(rezultat) + '\n')
else:
    print("Datele de intrare NU corespund restricțiilor impuse")
    exit(0)