Cod sursa(job #304154)

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

#define MAX_N 100

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

inline int max(const int &a, const int &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) 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()
{
    long long logN;
    for(logN = 1; logN <= (long long)P*Q; logN <<= 1);

    for(int j = 1; j <= K; ++j)
    {
        long long i, lg;
        for(i = (long long)P*Q, lg = logN; lg; lg >>= 1)
            if(i - lg > 0 && des((i - lg) * T[j], T[j]) >= R[j])
                i -= lg;

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

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

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