340
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