Cod sursa(job #1334675)

Utilizator zhm248Mustatea Radu zhm248 Data 4 februarie 2015 16:09:00
Problema GFact Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.18 kb
#include<cstdio>
#include<math.h>
using namespace std;
long long prim(long long x)
{
    if(x==0||x==1)
        return 0;
    else
    {
        if(x==2)
            return 1;
        else
        {
            if(x%2==0)
                return 0;
            else
            {
                int lim=(int)sqrt(x);
                for(int i=3; i<=lim; i=i+2)
                {
                    if(x%i==0)
                        return 0;
                }
            }
        }
    }
    return 1;
}

long long putere(long long a,long b)
{
    if(b==0)
        return 1;
    else
    {
        int nr=1;
        for(int i=1; i<=b; ++i)
        {
            nr*=a;
        }
        return nr;
    }
}

long long fact(long long a,long long b)
{
    int nr=0;
    while(b%a==0)
    {
        b/=a;
        nr++;
    }
    return nr;
}

int main()
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    long long p,q,lim,x,max=0,j,a,b,c,k,i;
    scanf("%lld%lld",&p,&q);
    if(prim(p)==1)
    {
        for(j=1; j<=31; ++j)
        {
            if(putere(p,j)>=(q*(p-1)+1))
            {
                if(j==1&&max<p)
                    max=p;
                else
                {
                    a=putere(p,j-1);
                    b=a/(p-1);
                    c=putere(p,j);
                    for(k=a+p; k<=c; k=k+p)
                    {
                        b+=fact(p,k);
                        if(b>=q)
                        {
                            if(max<k)
                                max=k;
                            break;
                        }
                    }
                }
                break;
            }
        }
    }
    else
    {
        lim=(int)sqrt(p);
        for(i=2; i<=lim; ++i)
        {
            if(prim(i)==1&&p%i==0)
            {
                x=0;
                while(p%i==0)
                {
                    p/=i;
                    x++;
                }
                x*=q;
                for(j=1; j<=31; ++j)
                {
                    if(putere(i,j)>=(x*(i-1))+1)
                    {
                        if(j==1&&max<i)
                            max=i;
                        else
                        {
                            a=putere(i,j-1);
                            b=a/(i-1);
                            c=putere(i,j);
                            for(k=a+i; k<=c; k=k+i)
                            {
                                b+=fact(i,k);
                                if(b>=x)
                                {
                                    if(max<k)
                                        max=k;
                                    break;
                                }
                            }
                        }
                        break;
                    }
                }
                if(prim(p)==1)
                {
                    for(j=1; j<=31; ++j)
                    {
                        if(putere(p,j)>=(q*(p-1)+1))
                        {
                            if(j==1&&max<p)
                                max=p;
                            else
                            {
                                a=putere(p,j-1);
                                b=a/(p-1);
                                c=putere(p,j);
                                for(k=a+p; k<=c; k=k+p)
                                {
                                    b+=fact(p,k);
                                    if(b>=q)
                                    {
                                        if(max<k)
                                            max=k;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    break;
                }
                else
                {
                    if(p==1)
                        break;
                }
            }
        }
    }
    printf("%lld",max);
    return 0;
}