Cod sursa(job #2298194)

Utilizator BotzkiBotzki Botzki Data 7 decembrie 2018 18:04:01
Problema Divizori Primi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin("divprim.in");
ofstream fout("divprim.out");
const int NMAX=1000000;
bitset <NMAX+5> prim;
vector <int>nrprim;
vector <int>numere[NMAX+5];
void ciur_eratosthene(int n)
{
    int i, j;
    prim[1]=1;
    for(i=2;i<=n;i++)
    {
        if(prim[i]==0)
        {
            nrprim.push_back(i);
            for(j=i*2;j<=n;j=j+i)
                    prim[j]=1;
        }
    }
}
void divizori_primi(int n)
{
    int d, nr=0, i=0, cn;
    bool ok=0;
    cn=n;
    d=nrprim[i];
    while(d*d<=n and n>1)
    {
        ok=0;
        while(n%d==0)
        {
            ok=1;
            n=n/d;
        }
        if(ok==1)
            nr++;
         i++;
         d=nrprim[i];
    }
    if(n>1)
        nr++;
     numere[nr].push_back(cn);

}
int cautare_binara(int val, int n)
{
    int st=0,dr, med, solutie=0;
    dr=numere[val].size()-1;
    while(st<=dr)
    {
        med=(st+dr)>>1;
        if(numere[val][med]<=n)
        {
            if(numere[val][med]>solutie)
             solutie=numere[val][med];
            st=med+1;
        }
        else
                dr=med-1;
    }
    return solutie;
}

int main()
{
    int i, t, k, n;
    ciur_eratosthene(NMAX+5);
    for(i=2;i<=NMAX;i++)
       divizori_primi(i);
    fin>>t;
    for(i=1;i<=t;i++)
    {
        fin>>n>>k;
        fout<<cautare_binara(k, n)<<"\n";
    }
    return 0;
}