1438 - Razboi

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.

Enunţ

În Regatul Numerelor, a început războiul civil. Se dau n soldați, reprezentați prin n numere naturale, nu neapărat distincte. Cei n soldați sunt recrutați în două batalioane adverse, după o lege de recrutare. Această lege are un număr asociat, care este egal cu 1 sau 2. Dacă legea este 1, atunci soldații care au ultima cifră egală cu 0, 2, 4, 6 și 8 sunt recrutați de primul batalion, iar ceilalți de cel de-al doilea. Dacă legea e 2, atunci soldații care au suma divizorilor număr par sunt recrutați de primul batalion, iar restul de cel de-al doilea.

Cerinţa

Dându-se n, numărul de soldați, L, legea de recrutare, și identificatorii celor n soldați, să se afișeze numărul soldaților din primul, respectiv al doilea batalion.

Date de intrare

Fișierul de intrare razboi.in conține pe prima linie numerele n şi L, cu semnificaţiile din enunţ, iar pe a doua linie se găsesc n numere reprezentând identificatorii celor n soldați.

Date de iesire

Dacă datele sunt introduse corect, în fișier se va afișa: "Datele sunt introduse corect.", apoi fișierul de ieșire razboi.out va conține pe prima linie cele două numere cerute, separate printr-un spațiu. În cazul în care datele nu respectă restricțiile, se va afișa în fișier: "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

  • 0 ⩽ n ⩽ 60 000
  • Numerele din şir < 100 000

Exemplul 1

razboi.in
3 2
6 17 2
razboi.out
Datele sunt introduse corect.
2 1

Explicație

Suma divizorilor lui 6 este 12. Suma divizorilor lui 17 este 18. Suma divizorilor lui 2 este 3.

Așadar, primul batalion are doi soldați, iar al doilea batalion are unul singur.

Exemplu2

razboi.in
10 1
15 150 12 36 45 78 85 95 93 141
razboi.out
Datele sunt introduse corect.
4 6

Explicație

Suma divizorilor lui 6 este 12. Suma divizorilor lui 17 este 18. Suma divizorilor lui 2 este 3.

Așadar, primul batalion are doi soldați, iar al doilea batalion are unul singur.

Exemplu3

razboi.in
10 2
15 150 12 36 45 78 85 95 93 14
razboi.out
Datele sunt introduse corect.
9 1

Rezolvare

def sd(n):
    s = 0
    for i in range(1, int(n**0.5)+1):  # se iterează prin toate numerele de la 1 la rădăcina pătrată a lui n
        if n % i == 0:  # dacă i divide n
            s += i + n // i  # se adaugă i și n/i la sumă
        if i * i == n:  # dacă i este rădăcina pătrată a lui n
            s -= i  # se scade i din sumă, deoarece a fost adăugat de două ori (de la i și de la n/i)
    return s


def validare_date(numar1, numar2):
    flag = False
    if numar1.isdigit() and numar2.isdigit():  # se verifică dacă cele două numere sunt formate din cifre
        if 0 < int(numar1) <= 60000 and 0 < int(numar2) <= 100000:  # se verifică dacă cele două numere sunt în intervalele cerute
            flag = True
    return flag


if __name__ == '__main__':
    with open('razboi.in', 'r') as f:
        n, L = f.readline().split()  # se citesc primele două numere din fișierul 'razboi.in'
        soldati = list(map(int, f.readline().split()))  # se citesc soldații din fișierul 'razboi.in' și se transformă din string-uri în numere întregi

    if validare_date(n, L):  # se validează cele două numere citite din fișier
        n = int(n)  # se transformă n din string în număr întreg
        L = int(L)  # se transformă L din string în număr întreg

        cnt = 0
        for x in soldati:
            if sd(x) % 2 == 0:  # se verifică dacă suma divizorilor lui x este pară
                cnt += 1  # se incrementează cnt dacă suma divizorilor este pară
        with open('razboi.out', 'w') as f:
            f.write("Datele sunt introduse corect.\n")
            f.write(str(cnt) + ' ' + str(n - cnt) + '\n')  # se scriu în fișierul 'razboi.out' numărul de soldați cu suma divizorilor pară și numărul de soldați cu suma divizorilor impară
    else:
        f.write("Datele nu corespund restricțiilor impuse.") # scrierea mesajului de eroare în fișierul de ieșire