Cod sursa(job #1753421)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 6 septembrie 2016 15:22:38
Problema Divizori Primi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define NMAX 1000000
using namespace std;

int nr_divs[NMAX + 5];
int m[8][NMAX + 5];
int nr[8];

void make_sleve(){
    m[0][++nr[0]] = 1;

    for (int i = 2; i <= NMAX; ++i){

        if (!nr_divs[i]){

            //if (i <= 1000)
            for (int j = i; j <= NMAX; j += i)
                ++nr_divs[j];
        }
        m[nr_divs[i]][++nr[nr_divs[i]]] = i;
    }
}

int main()
{
    #define USE_FILES
    #ifdef USE_FILES
    ifstream fin("divprim.in");
    ofstream fout("divprim.out");

    #define cin fin
    #define cout fout
    #endif // USE_FILES

    make_sleve();

    int t;
    cin >> t;

    for (int i = 0; i < t; ++i){
        int n, k;
        cin >> n >> k;

        int st = 0;
        int dr = nr[k];

        while (st <= dr){
            int mij = (st + dr) / 2;
            if (m[k][mij] > n){
                dr = mij - 1;
            }
            else st = mij + 1;
        }

        cout << m[k][dr] << '\n';
    }


    return 0;
}