1438 - Razboi: Difference between revisions
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... |
No edit summary |
||
Line 8: | Line 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 == |
Revision as of 10:20, 25 March 2023
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
<syntaxhighlight lang="python" line> 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.")
</syntaxhighlight>