fbpx

Problema #1438 – Razboi – Rezolvari PBInfo

de Mihai-Alexandru

Î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.

Î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
#include <bits/stdc++.h>
using namespace std;

ifstream cin("razboi.in");
ofstream cout("razboi.out");

int sd(int n)
{
    int s=0;
    for(int i = 1 ; i * i <= n ; ++i)
    {
        if(n%i==0)
        s+=i+n/i;
        if(i*i==n)
        s-=i;
    }
    return s;
}

int main()
{
    int n;
    cin >> n;
    int c;
    cin >> c;
    if(c==1)
    {
        int x , cnt=0;
        for(int i = 0 ; i < n ; ++i)
        {
            cin >> x;
            if(x%2==0)
            cnt++;
        }
        cout << cnt << ' ' << n-cnt;
    }
    if(c==2)
    {
        int x , cnt=0;
        for(int i = 0 ; i < n ; ++i)
        {
            cin >> x;
            if(sd(x)%2==0)
            cnt++;
        }
        cout << cnt << ' ' << n-cnt;
    }
    return 0;    
}
Comentarii

S-ar putea sa iti placa