# PBinfo #1438 – razboi – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## 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 ieșire
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

1 ≤ n ≤ 60 000
Numerele din şir sunt mai mici decât 100 000

Exemplul 1
razboi.in

3 2
6 17 2
razboi.out

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.

Exemplul 2
razboi.in

10 1
15 150 12 36 45 78 85 95 93 141
razboi.out

4 6
Exemplul 3
razboi.in

10 2
15 150 12 36 45 78 85 95 93 14
razboi.out

9 1

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream in("razboi.in");
ofstream out("razboi.out");
int sumadivi(int n) {
    int S = 0;
    for(int i = 1; i * i <= n; i++) {
        if (i * i == n) S = S - i;
        if (n % i == 0) S = S + i + n / i;
    } return S;
}
int main() {
    int n, L;
    in >> n >> L;
    if (L == 1) {
        int nr, temp = 0;
        for (int i = 0; i < n; i++) {
            in >> nr;
            if (nr % 2 == 0) temp++;
        } out << temp << " " << n - temp;
    } if (L == 2) {
        int nr, temp = 0;
        for (int i = 0; i < n; i++) {
            in >> nr;
            if (sumadivi(nr) % 2 == 0) temp++;
        } out << temp << " " << n - temp;
    } return 0;    
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1438)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1438/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1438/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
