Cod sursa(job #304158)

Utilizator Mishu91Andrei Misarca Mishu91 Data 11 aprilie 2009 01:14:18
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>

#define MAX_N 100

int P, Q, K;
int T[MAX_N], R[MAX_N];
long long Sol;

inline long long max(const long long &a, const long long &b)
{
    return ((a) > (b))? (a) : (b);
}

void desc(int x)
{
    for(int i = 2; i*i <= x; ++i)
        if(x % i == 0)
        {
            T[++K] = i;

            int p = 0;
            while(x % i == 0)
                x /= i,
                ++p;

            R[K] = p;
        }

    if(x > 1) T[++K] = x, R[K] = 1;

    for(int i = 1; i <= K; ++i)
        R[i] *= Q;
}

int des(long long B, int T)
{
    int Sol = 0;
    
    while(B)
    {
        Sol += B / T;
        B /= T;
    }
    return Sol;
}

void solve()
{
    for(int j = 1; j <= K; ++j)
    {
        int lg;
        for(lg = 1; lg <= R[j]; lg <<= 1);

        int i;
        for(i = R[j]; lg; lg >>= 1)
            if(i - lg > 0 && des((long long)(i - lg) * T[j], T[j]) >= R[j])
                i -= lg;

       Sol = max(Sol, (long long)(i - lg) * T[j]);
    }
    printf("%lld\n",Sol);
}

int main()
{
    freopen("gfact.in","rt",stdin);
    freopen("gfact.out","wt",stdout);

    scanf("%d %d", &P, &Q);
    desc(P);
    solve();
}