1912 - Becuri

De la Universitas MediaWiki

Cerința

Chris vă propune un joc cu becuri.

  • în joc sunt n becuri
  • inițial toate cele n becuri au culoarea albastru
  • fiecare bec poate avea doar două culori: roșu sau albastru
  • se efectuează n parcurgeri, pentru k de la 1 la n. La parcurgerea de rang k, se schimbă culoarea fiecărui bec situat pe poziţii având indicii multipli de k, din roşu în albastru şi invers.

Știind numărul n de becuri, să se afișeze numărul de becuri care au culoarea roșie după terminarea jocului.

Date de intrare

Fișierul de intrare becuriin.txt conține pe prima linie numărul de becuri n.

Date de ieșire

Fișierul de ieșire becuriout.txt va conține pe prima linie numărul de becuri care au culoarea roșie după terminarea jocului.

Restricții și precizări

  • numerotarea pozițiilor becurilor începe cu 1
  • 1 ⩽ n ⩽ 10^9

Exemplul 1

Intrare
becuriin.txt
6
Ieșire
Datele de intrare corespund restricțiilor impuse
becuriout.txt
2

Exemplul 2

Intrare
becuriin.txt
10
Ieșire
Datele de intrare corespund restricțiilor impuse
becuriout.txt
3

Exemplul 3

Intrare
becuriin.txt
18
Ieșire
Datele de intrare corespund restricțiilor impuse
becuriout.txt
4

Exemplul 4

Intrare
becuriin.txt
0
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#1912 - Becuri

def validare_date(n):
    if not (1 <= n <= 10**9):
        return False
    return True


def numar_becuri_rosii(n):
    becuri = [0] * (n + 1)

    for k in range(1, n + 1):
        for i in range(k, n + 1, k):
            becuri[i] = 1 - becuri[i]

    return sum(becuri)


with open("becuriin.txt", "r") as f:
    n = int(f.readline().strip())

if validare_date(n):
    print("Datele de intrare corespund restricțiilor impuse")

    rezultat = numar_becuri_rosii(n)
    with open("becuriout.txt", "w") as f:
        f.write(str(rezultat) + "\n")
else:
    print("Datele de intrare NU corespund restricțiilor impuse")
    exit(0)