fbpx

Problema #3318 – Eratostene7 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dau n perechi de numere naturale, x şi k. Verificaţi pentru fiecare număr x dacă este produs de k numere prime distincte.

Date de intrare

Fișierul de intrare eratostene7.in conține pe prima linie numărul n, iar pe următoarele n linii câte o pereche de numere x şi k, separate prin spaţiu.

Date de ieșire

Fișierul de ieșire eratostene7.out va conține pe primele n linii cuvântul DA sau NU corespunzător celei de-a n-a perechi din fişierul de intrare.

Restricții și precizări

  • 1 ≤ n ≤ 100.000
  • 1 ≤ x ≤ 1.000.000
  • 1 ≤ k ≤ 100

Exemplu

eratostene7.in

3
20 3
30 3
49 2

eratostene7.out

NU
DA
NU

Explicație

Numărul 20 nu este produs de 3 numere prime distincte, 30=2•3•5 este produs de trei numere prime distincte, 49 nu este produs de 2 numere prime distincte.

#include <bits/stdc++.h>

using namespace std;

ifstream cin("eratostene7.in");
ofstream cout("eratostene7.out");

int p[500001], P;
bitset<10000000> e;

void eratostene(){
    e[0] = e[1] = 1;
    for(int i = 2; i * i <= 1000000; ++i)
        for(int j = i * i; j <= 1000000; j += i)
            e[j] = 1;
    for(int i = 1; i <= 1000000; ++i)
        if(!e[i])
            p[++P] = i;
}

int desc(int n){
    int d = 1;
    int cnt=0;
    bool ok = 1;
    while(n > 1){
        int pi = 0;
        while(n % p[d] == 0)
            n/=p[d], pi++;
        if(pi == 1)
            cnt++;
        else if(pi > 1)
            ok = false;
        d++;
        if(n > 1 && p[d] * p[d] > n){
            cnt++;
            break;
        }
    }
    if(ok)
    return cnt;
    else
        return -1;
}

int main(){
    int n;
    eratostene();
    cin >> n;
    for(int i = 1; i <= n; ++i){
        int x, y;
        cin >> x >> y;
        if(desc(x) == y)
            cout << "DA" << '\n';
        else
            cout << "NU" << '\n';
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa