1438 - Razboi
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 &les ; n &les ; 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>