1438 - Razboi: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == 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-a...)
 
Fără descriere a modificării
Linia 8: Linia 8:
Fișierul de ieșire '''razboi.out''' va conține pe prima linie cele două numere cerute, separate printr-un spațiu.
Fișierul de ieșire '''razboi.out''' va conține pe prima linie cele două numere cerute, separate printr-un spațiu.
== Restricții și precizări ==
== Restricții și precizări ==
* 0 &les ; n &les ;  60 000
* 0 ⩽ n ⩽  60 000
*Numerele din şir < 100 000  
*Numerele din şir < 100 000  
== Exemplul 1 ==
== Exemplul 1 ==

Versiunea de la data 25 martie 2023 10:20

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

Fișierul de ieșire razboi.out va conține pe prima linie cele două numere cerute, separate printr-un spațiu.

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 introduse corespund restricțiilor impuse.
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 introduse corespund restricțiilor impuse.
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
9 1

Rezolvare

def sd(n):
    s = 0
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            s += i + n // i
        if i * i == n:
            s -= i
    return s


def validare_date(numar1, numar2):
    flag = False
    if numar1.isdigit() and numar2.isdigit():
        if 0 < int(numar1) <= 60000 and 0 < int(numar2) <= 100000:
            flag = True
    return flag


if __name__ == '__main__':
    with open('razboi.in', 'r') as f:
        n, L = f.readline().split()
        soldati = list(map(int, f.readline().split()))

    if validare_date(n, L):
        n = int(n)
        L = int(L)

        cnt = 0
        for x in soldati:
            if sd(x) % 2 == 0:
                cnt += 1

        with open('razboi.out', 'w') as f:
            f.write(str(cnt) + ' ' + str(n - cnt) + '\n')
    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")