Cod sursa(job #960586)

Utilizator primulDarie Sergiu primul Data 10 iunie 2013 19:31:54
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#include<math.h>
 
long long dp[20],de[20],nr,p,q;
 
void desc(int p)
{
    int i,j,max=sqrt(p);
 
    for(i=2;i<=max;++i)
    {
        if(p%i==0)
        {
            j=0;
            while(p%i==0)
            {
                p=p/i;
                j++;
            }
            nr++;
            dp[nr]=i;
            de[nr]=j;
        }
    }
    if(p)
    {
        nr++;
        dp[nr]=p;
        de[nr]=1;
    }
}
 
int bun(long long n)
{
    int i;
    long long aux,num;
    for(i=1;i<=nr;++i)
    {
        aux=n;
        num=0;
        while(aux>=dp[i]&&aux>0)
        {
            num+=aux/dp[i];
            aux=aux/dp[i];
            if(num>=de[i])
                break;
        }
        if(num<de[i])
            return 0;
    }
    return 1;
}
 
long long cautb()
{
    int i;
    long long s,d,m,l;
    for(i=1;i<=nr;++i)
    {
        de[i]=de[i]*q;
        s=1;
        d=1LL<<60;
        while(s<=d)
        {
            m=(s+d)/2;
            if(bun(m))
            {
                l=m;
                d=m-1;
            }
            else
                s=m+1;
        }
    }
    return l;
}
 
int main()                       //dp,de
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    long long sol;
    scanf("%d%d",&p,&q);
 
    desc(p);
 
    sol=cautb();
 
    printf("%lld\n",sol);
    return 0;
}