fbpx

Problema #2330 – prim023 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Dorel a scris un şir format din n numere naturale nenule. Apoi a luat fiecare subşir şi a calculat produsul termenilor săi. Aflaţi câte dintre produsele efectuate sunt numere prime.

Date de intrare

Fișierul de intrare prim023.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 prim023.out va conține pe prima linie numărul produselor care sunt numere prime.

Restricții și precizări

  • 1 ≤ n ≤ 5000
  • numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000
  • un subşir conţine cel puţin un termen şi se formează alegând o parte din termenii şirului

Exemplu

prim023.in

3
1 2 3 

prim023.out

4

Explicație

Subşirurile care au produsul elementelor număr prim sunt: 2 ; 3 ; 1,2 ; 1,3.

#include <bits/stdc++.h>
using namespace std;
ifstream cin("prim023.in");
ofstream cout("prim023.out");
int E[35005], prime[6001], nrp;
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 = 1 ; prime[i] * prime[i] <= n && i <= nrp ; i ++) if(n % prime[i] == 0) return 0;
    return 1;
}

int main()
{
    int n , cnt = 0 , p = 0 , x , c = 1 , a[10001];
    cin >> n;

    for(int i = 2 ; i < 35000 ; i++) E[i] = 1;
    for(int i = 2 ; i < 35000 ; i++)
        if(E[i] == 1)
        {
            prime[ ++ nrp] = i;
            for(int j = i * i; j < 35000; j += i) E[j] = 0;
        }
    for(int i = 0 ; i < n ; ++i)
    {
        cin >> x;
        if(prim(x)) cnt++;
        if(x==1) p++;
    }
    while(cnt)
    {
        a[c]=cnt%10;
        c++;
        cnt/=10;
    }
    c--;
    for(int i = 1; i <= p ; i++)
    {
        int t = 0;
        for(int j = 1; j <= c ; j++)
        {
            int cif=a[j]*2+t;
            a[j] = cif % 10;
            t=cif/10;
        }
        while(t)
        {
            a[++c]=t%10;
            t/=10;
        }
    }
    for(int i = c ; i >= 1 ; --i) cout << a[i];
    if(c==0)cout << c;
}
Comentarii

S-ar putea sa iti placa