Cod sursa(job #1106921)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 13 februarie 2014 12:59:31
Problema GFact Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int P,Q,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 int Nr(int b, long long n)
{
    long long val=0;
    int cb;
    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=1000000000;
    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("%d%d", &P,&Q);
    Divider();
    for(i=1;i<=b[0];++i)
        sol=max(sol, BSearch(b[i],ex[i]));
    printf("%lld\n", sol);
    return 0;
}