1438 - Razboi

From Bitnami MediaWiki
Revision as of 10:20, 25 March 2023 by Alexandra Leș (talk | contribs)

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>