Cod sursa(job #2846020)

Utilizator stefanchpStefan Chiper stefanchp Data 8 februarie 2022 17:38:50
Problema Divizori Primi Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
#define N 100000
using namespace std;

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

int n, m;
int f[N + 1], a[8][80000], d[80000];
int dim[] = { 0,0,0,0,0,0,0,0 };
bool c[N + 1];

void ciur()
{
    c[1] = 1;
    for (int i = 4; i <= N; i += 2)
        c[i] = 1;
    for (int i = 3; i * i <= N; i += 3)
        if (c[i] == 0)
            for (int j = i * i; j <= N; j += 2 * i)
                       c[j] = 1;
    for (int i = 1; i < N; i++)
        if (c[i] == 0) d[++m] = i;
}

int cb(int k, int val)
{
    int st = 0, dr = dim[k], mij, rez = 0;
    while (st <= dr)
    {
        mij = st + (dr - st) / 2;
        if (a[k][mij] <= val) rez = a[k][mij], st = mij + 1;
        else dr = mij - 1;
    }
    return rez;
}

int main()
{
    ciur(); bool ok;
    for (int i = 1; i <= m; i++)
        for (int j = d[i]; j <= N; j += d[i])
            f[j]++;
    for(int i=1;i<=N;i++)
        if (f[i] <= 7)
        {
            ok = 0;
            a[f[i]][dim[f[i]]++] = i;
        }
    int p, k;
    fin >> n;
    for (int i = 1; i <= n; i++)
    {
        fin >> p >> k;
        fout << cb(k, p) << '\n';
    }
    fin.close(); fout.close();
    return 0;
}