fbpx

Problema #2328 – prim013 – Rezolvari PBInfo

de Mihai-Alexandru

Dorel este pasionat de feng shui. Astfel, pentru a-şi crea un cadru adecvat meditaţiei, s-a hotărât să scrie pe pereţii casei numere care au un număr prim de divizori. El a găsit n numere, însă nu ştie să le aleagă pe cele potrivite.

Cerința

Se dau n numere naturale. Aflaţi câte dintre acestea au un număr prim de divizori.

Date de intrare

Fișierul de intrare prim013.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin spații.

Date de ieșire

Fișierul de ieșire prim013.out va conține pe prima linie numărul de numere care au un număr prim de divizori.

Restricții și precizări

  • 1 ≤ n ≤ 1.000.000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 10.000.000

Exemplu

prim013.in

5
1 3 6 9 625

prim013.out

3

Explicație

Numerele 3,9,625 au 2,3 respectiv 5 divizori, numărul divizorilor fiind prim. În total sunt 3 numere cu numărul divizorilor prim.

#include <bits/stdc++.h>
using namespace std;
ifstream fin("prim013.in");
ofstream fout("prim013.out");
int prim(int n)
{
    if(n == 0 || n == 1) return 0;
    if(n == 2) return 1;
    if(n % 2 == 0) return 0;
    for(int i = 3 ; i * i <= n ; i += 2) if(n % i == 0) return 0;
    return 1;
}
int nrdiv(int n)
{
    int d = 2 , prod = 1;
    while(n > 1)
    {
        int p = 0;
        while(n % d == 0) {n /= d; p++;}
        if(p) prod = prod * (p+1);
        d++;
        if(d * d > n) d =n;
    }
    return prod;
}
int main()
{
    int n , x , cnt = 0;
    fin >> n;
    for(int i = 1 ; i <= n ; ++i)
    {
        fin >> x;
        if(x != 1 && prim(nrdiv(x))) cnt++;
    }
    fout << cnt;

    fin.close();
    fout.close();

    return 0;
}
Comentarii

S-ar putea sa iti placa