Cod sursa(job #1401301)

Utilizator akaprosAna Kapros akapros Data 25 martie 2015 19:29:24
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Nmax 44735
using namespace std;
long long b,sol;
long long i,st,dr,mij;
bool w[Nmax-5];
long long pr[Nmax/5];
long long p[2005],d[2005],P,q,j,nr,s;
void numereprime()
{
    long long i,k,j;
    for (i=2;i<=Nmax-5;i++)
    if (!w[i])
    {
        pr[++pr[0]]=i;
        k=i*i*1LL;
        for (j=k;j<=Nmax-5;j+=i)
        w[j]=1;
    }
}
void desc(long long x)
{
    for (i=1;pr[i]*pr[i]*1LL<=x;i++)
    if (x%pr[i])
    {
        d[++d[0]]=pr[i];
        ++p[0];
        while (x%pr[i]) ++p[p[0]],x=x/pr[i];
    }
    if (x!=1) d[++d[0]]=x,p[++p[0]]=1,p[p[0]]*=q;
}
bool ok;
int main()
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    scanf("%lld %lld",&P,&q);
    numereprime();
    st=1; dr=700000000000;  sol=dr+1;
    p[0]=0; d[0]=0;
    desc(P);
    while (st<=dr)
    {
        mij=(st+dr)/2;
        ok=1;
        for (j=1;j<=d[0];j++)
        {
            nr=mij; s=0;
            while (nr)
            {
                s+=nr/d[j];
                nr=nr/d[j];
            }
            if (s<p[j]) {ok=0; break;}
        }
        if (ok)
        sol=min(sol,mij),dr=mij-1;
        else st=mij+1;
    }
    printf("%lld",sol);
    return 0;
}