Cerința
Definim un număr ca fiind fantastic dacă numărul de numere la care acesta se împarte exact este un număr prim.
Dându-se un șir cu n
numere întregi strict pozitive, să se afișeze numărul de numere fantastice din șir.
Date de intrare
Fișierul de intrare fantastice.in
conține pe prima linie numărul n
de numere, iar pe cea de-a doua linie, separate prin câte un spaţiu, cele n
numere.
Date de ieșire
Fișierul de ieșire fantastice.out
va conține pe prima linie numărul de numere fantastice din șir.
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 sau egale cu
1.000.000
Exemplu
fantastice.in
6 21 19 25 16 27 729
fantastice.out
4
Explicație
21
are divizorii 1
, 3
, 7
, 21
19
are divizorii 1
, 19
25
are divizorii 1
, 5
, 25
16
are divizorii 1
, 2
, 4
, 8
, 16
27
are divizorii 1
, 3
, 9
, 27
729
are divizorii 1
, 3
, 9
, 27
, 81
, 243
, 729
Deci sunt 4
numere fantastice: 19 25 16 729
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 Fantastice:
/*
prim - ciur
main - cu freq
nrdiv - euler
*/
#include <cmath>
#include <fstream>
using namespace std;
ifstream fin("fantastice.in");
ofstream fout("fantastice.out");
int nrdiv(int);
void CIUR();
int prim(int);
int ciur[250],n,a[1000005],freq[1000005],viz[1000005],nr;
int main(){///main - cu freq
CIUR();
fin>>n;
for (int i=1;i<=n;i++){
fin>>a[i];
freq[a[i]]++;
}
for (int i=1;i<=n;i++){
if (!viz[a[i]]){
if (prim(nrdiv(a[i]))){
nr+=freq[a[i]];
}
viz[a[i]]=1;
}
}
fout<<nr;
return 0;
}
int prim(int n){///prim - ciur
return (ciur[n]==0);
}
int nrdiv(int n){///nrdiv - euler
int nr=1,d=2,rad=sqrt(n);
while (d<n){
int e=0;
while (n%d==0){
e++;
n/=d;
}
nr*=e+1;
d++;
}
if (n>1){
nr*=2;
}
return nr;
}
void CIUR(){///ciur
ciur[0]=ciur[1]=1;
for (int i=2;i<=16;i++){
for (int j=i*i;j<=240;j+=i){
ciur[j]=1;
}
}
}
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 .
Rezolvarea problemei #1931 Fantastice
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1931 Fantastice 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!