Cod sursa(job #1106927)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 13 februarie 2014 13:06:42
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>

using namespace std;

long long P,Q;
int b[1000000],ex[1000000];
long long sol;

inline void Divider()
{
    int k=0,d=3,i;
    while(P%2==0)
    {
        ++k;
        P/=2;
    }
    if(k)
    {
        b[++b[0]]=2;
        ex[b[0]]=k;
    }
    while(P>1 && d*d<=P)
    {
        k=0;
        while(P%d==0)
        {
            ++k;
            P/=d;
        }
        if(k)
        {
            b[++b[0]]=d;
            ex[b[0]]=k;
        }
        d+=2;
    }
    if(P>1)
    {
        b[++b[0]]=P;
        ex[b[0]]=1;
    }
    for(i=1;i<=b[0];++i)
        ex[i]*=Q;
}

inline long long Nr(int B, long long n)
{
    long long val=0,cb,b=B;
    cb=b;
    while(b<=n)
    {
        val+=(n/b);
        b*=cb;
    }
    return val;
}

inline long long BSearch(int b, int exp)
{
    long long st,dr,mij,sol;
    st=1; dr=100000000000;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(Nr(b,mij)>=exp)
        {
            sol=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return sol;
}

int main()
{
    int i;
    freopen ("gfact.in","r",stdin);
    freopen ("gfact.out","w",stdout);
    scanf("%lld%lld", &P,&Q);
    Divider();
    for(i=1;i<=b[0];++i)
        sol=max(sol, BSearch(b[i],ex[i]));
    printf("%lld\n", sol);
    return 0;
}