1237 - Numereiajb

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.

Cerinta

Numerele iajb sunt numerele care pot fi scrise sub forma i * a + j * b, cu i și j numere naturale și i + j > 0.

Cunoscând a și b și un număr n, să se determine valorile i și j pentru care se vor forma primele n numere iajb in ordine crescătoare.

Date de intrare

Fișierul de intrare numereiajbIN.txt conține pe prima linie numărul 3 numere naturale a, b și n, având semnificațiile de mai sus.

Date de ieșire

Fișierul de ieșire numereiajbOUT.txt va conține pe cele n linii câte o pereche de numere naturale i și j care răspund cerinței. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări

  • 1 ≤ n ≤ 2.000.000 (!)
  • 1 ≤ a, b ≤ 50.000
  • Dacă un număr iajb se obține din perechi diferite de (i, j) atunci se va afișa doar cea cu i-ul minim

Exemplul 1:

numereiajbIN.txt

2 3 5

numereiajbOUT.txt

1 0
0 1
2 0
1 1
0 2

Explicație

1 * 2 + 0 * 3 = 2

0 * 2 + 1 * 3 = 3

2 * 2 + 0 * 3 = 4

1 * 2 + 1 * 3 = 5

0 * 2 + 2 * 3 = 6

Exemplul 2:

numereiajbIN.txt

2 3 50001

numereiajbOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

def verificare_restrictii(n, a, b):
    if not (1 <= n <= 2000000 and 1 <= a <= 50000 and 1 <= b <= 50000):
        with open("numereiajbOUT.txt", "w") as fout:
            fout.write("Datele nu corespund restrictiilor impuse")
        return False
    return True

def main():
    fin = open("numereiajbIN.txt", "r")
    fout = open("numereiajbOUT.txt", "w")

    n, a, b = map(int, fin.readline().split())
    if not verificare_restrictii(n, a, b):
        fin.close()
        fout.close()
        return

    Q = [[], []]
    Q[0].append((1, 0))
    Q[1].append((0, 1))
    last = -1

    for t in range(1, n + 1):
        crt = [Q[j][0][0] * a + Q[j][0][1] * b for j in range(2)]
        if crt[0] < crt[1]:
            i, j = Q[0].pop(0)
            nr = crt[0]
        else:
            i, j = Q[1].pop(0)
            nr = crt[1]
        if nr == last:
            t -= 1
            continue
        last = nr
        fout.write(f"{i} {j}\n")
        Q[0].append((i + 1, j))
        Q[1].append((i, j + 1))

    fin.close()
    fout.close()

if __name__ == "__main__":
    main()