Cod sursa(job #1911185)

Utilizator patrickdanDan patrick patrickdan Data 7 martie 2017 19:41:52
Problema GFact Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>

using namespace std;
int p,q;
struct data
{
    int p,ex;
}des[2000005];
int descompunere(int n)
{
    int d=2,e,nr=0;
    while(n>1)
    {
        while(n%d==0)
        {
            n=n/d;
            e++;
        }
        if(e)
            {
                des[++nr].p=d;
                des[nr].ex=e*q;
            }
        d++;
    }
    if(n>1)
    {
        des[++nr].p=n;
        des[nr].ex=q;
    }
}
long long legendre(int k,long long n)
{
    long long numitor=k,s=0;
    while(numitor<=n)
    {
        s=s+n/numitor;
        numitor=numitor*k;
    }
    return s;
}
long long cautbin(int poz)
{
    long long st,dr,med,last,ans;
    int k=des[poz].p;
    st=1;
    dr=1LL<<62;
    while(st<=dr)
    {
        med=st-(st-dr)/2;
        ans=legendre(k,med);
        if(ans>=des[poz].ex)
        {
            last=med;
            dr=med-1;
        }
        else
            st=med+1;
    }
    return last;
}
int main()
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    int i,stare=0,j;
    long long max=-1000000;
    scanf("%d%d",&p,&q);
    descompunere(p);
    for(i=1;des[i].ex!=0;i++)
    {
        int rezaux=cautbin(i);
        if(rezaux>max)
            max=rezaux;
    }
    printf("%lld",max);
    return 0;
}