Cod sursa(job #1231178)

Utilizator apopeid15Apopei Daniel apopeid15 Data 19 septembrie 2014 20:35:20
Problema Divizori Primi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fin ("divprim.in");
ofstream fout ("divprim.out");

const int N = 1e6 + 5;

int phi[N], t, n, k;
vector <int> divp[8];

int main() {
    for (int i = 2; i < N; i += 2)
        phi[i]++;
    for (int i = 3; i < N; i += 2)
        if (!phi[i])
            for (int j = i; j < N; j += i)
                phi[j]++;
    for (int p = 1; p < N; ++p)
        divp[phi[p]].push_back (p);
    fin >> t;
    while (t--) {
        fin >> n >> k;
        int step = 1 << 19, sol = 0;
        for (; step; step >>= 1)
            if (sol + step < divp[k].size() && divp[k][sol + step] <= n)
                sol += step;
        if (divp[k][sol] > n)
            fout << "0\n";
        else
            fout << divp[k][sol] << "\n";
    }
}