Cod sursa(job #2656155)

Utilizator AswVwsACamburu Luca AswVwsA Data 6 octombrie 2020 21:26:10
Problema GFact Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 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;
unsigned int p,q,nr[4653]= {1,2},fact[14],exp[14],dim,cp;
//4647
bool ok(unsigned long long  ceva){
    for (unsigned int i=1;i<=dim;++i){
        unsigned long long cnt=0,lim=exp[i]*q;
        for (unsigned long long j=fact[i];j<=ceva and cnt<lim;j*=fact[i])
            cnt+=ceva/j;
        if (cnt<lim)
        return 0;
    }
    return 1;
}
int bs(unsigned long long  st, unsigned long long  dr){
unsigned long long  last;
while (st<=dr){
    //cout<<st<<' '<<dr<<'\n';
    unsigned long long 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;
    cp=p;
    for (unsigned int i=1;i<=nr[0] and nr[i]*nr[i]<=p;++i)
    {
        if (p%nr[i])
            continue;
        fact[++dim]=nr[i];
        for (;p%nr[i]==0;p/=nr[i]) exp[dim]++;
    }
    if (p>1){
        fact[++dim]=p;
        exp[dim]=1;
    }
/*
2000000000 30000 1080015
123456 30000   19260422
111111111 29999 10009676333
*/

    cout<<bs(1,1ULL*cp*q);
}