1438 - Razboi

From Bitnami MediaWiki
Revision as of 10:19, 25 March 2023 by Alexandra Leș (talk | contribs) (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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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>