Rezolvare completă PbInfo #3314 Eratostene3

Cerința

Se dau n numere naturale nenule. Aflaţi pentru fiecare număr dat x, câte numere naturale nenule mai mici sau egale cu x sunt prime cu x?

Date de intrare

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

Date de ieșire

Fișierul de ieșire eratostene3.out va conține pentru fiecare număr x din fişierul de intrare, numărul de numere naturale nenule mai mici sau egale cu x, prime cu x.

Restricții și precizări

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

Exemplu

eratostene3.in

3
4 7 12

eratostene3.out

2 6 4

Explicație

Numerele prime cu 4, mai mici sau egale cu 4, sunt: 1,3.
Numerele prime cu 7, mai mici sau egale cu 7, sunt: 1,2,3,4,5,6.
Numerele prime cu 12, mai mici sau egale cu 12, sunt: 1,5,7,11.
Vezi Indicatorul lui Euler.

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 Eratostene3:

#include <fstream>
using namespace std;
ifstream f("eratostene3.in");
ofstream g("eratostene3.out");
int i,j,x,n;
int p[1000000], phi[1000000];

int main()
{
    p[1] = 1;
    phi[1] = 1;
    for(i = 1; i <= 999999; i++)
        phi[i] = i;
    for(i = 2; i <= 999999; i++)
        if(p[i]==0)
    {
        phi[i] = i - 1;
        j = i + i;
        while(j <= 999999)
        {
            phi[j] = phi[j] / i;
            phi[j] = phi[j] * (i - 1);
            p[j] = 1;
            j = j + i;
        }
    }
    f >> n;
    for(i = 1; i <= n; i++)
    {
        f >> x;
        g << phi[x] << " ";
    }
    return 0;
}

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 Adresa de email.

Rezolvarea problemei #3314 Eratostene3

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3314 Eratostene3 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!