Cod sursa(job #1339928)

Utilizator bogdi1bogdan bancuta bogdi1 Data 11 februarie 2015 12:31:21
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>

using namespace std;
int f[15];
int e[15];
inline long legendre(long long n, int p)
{
    unsigned long long s=0;
    while(n){
        s=s+n/p;
        n/=p;
    }
    return s;
}
inline long long bs(int poz)
{
    long long st,dr,med,nr,last=-1;
    st=1;
    dr=(1LL<<60)-1;
    while(st<=dr){
        med=(st+dr)/2;
    nr=legendre(med,f[poz]);
    if(nr<0)
        nr=(1LL<<60)-1;
    if(nr>=e[poz]){
        last=med;
        dr=med-1;
    }
    else
        st=med+1;
    }
    return last;
}
int main()
{   freopen("gfact.in", "r",stdin);
    freopen("gfact.out", "w",stdout);
    int p,q,d,ex,nf=0,i;
    long long b,max=1;
    scanf("%d%d", &p, &q);
    d=2;
    while(1LL*d*d<=p && p>1){
        ex=0;
        while(p%d==0){
            ex++;
            p/=d;
        }
        if(ex>0){
            f[++nf]=d;
            e[nf]=ex*q;
        }
        d++;
    }
    if(p>1){
        f[++nf]=p;
        e[nf]=q;
    }
    for(i=1; i<=nf; i++){
        b=bs(i);
        if(b>max)
            max=b;
    }
    printf("%I64d", max);
    return 0;
}