Rezolvare completă PbInfo #1438 Razboi

Î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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Razboi:

#include <fstream>

using namespace std;

ifstream f("razboi.in");
ofstream g("razboi.out");

int n,x,d,sp,si,nrp,nri,i,p,s;
int main(){
    f>>n>>p;
    for (i=1;i<=n;i++){
        f>>x;
        if (p==1){
            if (x%2==0){
                nrp++;
            }
            else {
                nri++;
            }
        }
        else {
            s=1;
            for (d=2;d*d<x;d++){
                if (x%d==0){
                    s+=d+x/d;
                }
            }
            if (x>1){
                s+=x;
            }
            if (d*d==x){
                s+=d;
            }
            if (s%2==0){
                sp++;
            }
            else {
                si++;
            }
        }
    }
    if (p==1){
        g<<nrp<<<<nri;
    }
    else {
        g<<sp<<<<si;
    }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1438 Razboi

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1438 Razboi de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!