Cod sursa(job #2656149)

Utilizator AswVwsACamburu Luca AswVwsA Data 6 octombrie 2020 20:56:37
Problema GFact Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <bitset>
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
/*
ifstream cin("ciorna.in");
ofstream cout("ciorna.out");*/
const int nmax=44723;
bitset <nmax> c;
int p,q,nr[4653]= {1,2},fact[14],exp[14],dim;
//4647
bool ok(int ceva){
    for (int i=1;i<=dim;++i){
        int cnt=0,lim=exp[i]*q;
        for (int j=fact[i];j<=ceva and cnt<lim;j*=fact[i])
            cnt+=ceva/j;
        if (cnt<lim)
        return 0;
    }
    return 1;
}
int bs(int st, int dr){
int last;
while (st<=dr){
    int med=((st+dr)>>1);
    if (ok(med))
    {
        last=med;
        dr=med-1;
    }
    else st=med+1;
}
return last;
}
int main()
{
    for (int i=3; i<=nmax; i+=2)
        if (!c[i])
        {
            nr[++nr[0]]=i;
            for (int j=i*i; j<=nmax; j+=(i<<1))
                c[j]=1;
        }/*
    int cnt=0;
    for (int i=2; i<=nmax; ++i)
        cnt+=!c[i];*/
    cin>>p>>q;
    for (int i=1;i<=nr[0] and nr[i]*nr[i]<=p;++i)
    {
        if (p%nr[i])
            continue;
        fact[++dim]=i;
        for (;p%nr[i]==0;p/=nr[i]) exp[dim]++;
    }
    if (p>1){
        fact[++dim]=p;
        exp[dim]=1;
    }
    cout<<bs(1,1000000);
}