Cod sursa(job #2387184)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 24 martie 2019 13:37:58
Problema GFact Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <cstdio>
#define MAXDIV 30
using namespace std;
int d[MAXDIV+1],e[MAXDIV+1],nrdivprimi=0,p,q,n,dvz;
long long leg(int p,long long n) {
    long long put=0,prod=p;
    while(prod<=n) {
        put+=n/prod;
        prod*=p;
    }
    return put;
}
bool divide(long long n) {
    for(int i=1;i<=nrdivprimi;i++)
        if(leg(d[i],n)<e[i]*q)
            return false;
    return true;
}
long long cautbin() {
    long long st=0,dr=2000000000,poz=0,mij;
    while(st<=dr) {
        mij=(st+dr)/2;
        if(divide(mij)==1) {
            poz=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return poz;
}
int main()
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    scanf("%d%d",&p,&q);
    n=p;
    for(dvz=2;dvz*dvz<=n;dvz++)
        if(n%dvz==0) {
            d[++nrdivprimi]=dvz;
            while(n%dvz==0) {
                e[nrdivprimi]++;
                n/=dvz;
            }
        }
    if(n>1) {
        d[++nrdivprimi]=n;
        e[nrdivprimi]=1;
    }
   /// cout<<nrdivprimi<<'\n';
    cout<<cautbin();

    return 0;
}