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; }