1943 - Bacterie

De la Universitas MediaWiki

Enunț

O echipă de arheologi a descoperit o hartă străveche a Ținutului de Nord, care era locuit de o civilizație condusă după reguli matematice foarte riguroase. Conform acestei hărți, Ținutul de Nord era împărțit în n rânduri a câte m comitate, fiecare comitat ocupând o suprafață pătrată de un hectar.

Însă descoperirile au mai arătat că această civilizație a fost atacată de la sud-vest de o bacterie periculoasă, ce a acționat astfel: în primul an, a infectat comitatul din colțul din stânga jos al hărții, în al doilea an a infectat cele două comitate vecine cu primul, în al treilea an a infectat cele trei comitate vecine cu anterioarele două și așa mai departe, infecția oprindu-se când bacteria a ajuns la marginea de sus sau la marginea din dreapta a hărții

Cerința

Scrieţi un program care să determine numărul de comitate rămase neinfectate după oprirea expansiunii bacteriei.

Date de intrare

Fișierul de intrare bacteriein.txt conține separate printr-un spaţiu, n și m, dimensiunile hărții.

Date de ieșire

Fișierul de ieșire bacterieout.txt va conține numărul de comitate rămase neinfectate după oprirea expansiunii bacteriei.

Restricții și precizări

  • 1 ⩽ n ⩽ 1.000.000.000
  • 1 ⩽ m ⩽ 1.000.000.000

Exemplul 1

Intrare
bacteriein.txt
3 5
Ieșire
Datele de intrare corespund restricțiilor impuse
bacterieout.txt
9

Explicație

Harta Ținutului de Nord cuprinde 3 rânduri a câte 5 comitate fiecare, având în total 15 comitate. Expansiunea bacteriei s-a oprit după 3 ani, deoarece a atins marginea de sus; au rămas 9 comitate neinfectate.

Exemplul 2

Intrare
bacteriein.txt
1000000001 1000000001
Ieșire
Datele de intrare NU corespund restricțiilor impuse


Rezolvare

#1943 - Bacterie
def verifica_restrictii(n, m):
    if 1 <= n <= 1000000000 and 1 <= m <= 1000000000:
        print("Datele de intrare corespund restricțiilor impuse")
    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        exit(0)


def numar_comitate_ramase_neinfectate(n, m):
    verifica_restrictii(n, m)

    total_comitate = n * m
    infectate = 0
    an = 1

    while an <= n:
        infectate += an  # comitate infectate într-un an
        an += 1
    comitate_ramase = total_comitate - infectate
    return comitate_ramase


# Citire din fișierul de intrare
with open("bacteriein.txt", "r") as file_in:
    n, m = map(int, file_in.readline().split())

# Calcul și scriere în fișierul de ieșire
with open("bacterieout.txt", "w") as file_out:
    rezultat = numar_comitate_ramase_neinfectate(n, m)
    file_out.write(str(rezultat))