Cod sursa(job #66933)

Utilizator DastasIonescu Vlad Dastas Data 21 iunie 2007 18:47:09
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <cmath>

#define maxdiv 50000

FILE *in = fopen("gfact.in","r"), *out = fopen("gfact.out","w");

int p, q;
int t[maxdiv];
int r[maxdiv];
int k;

void factorizare()
{
    int sq = (int)sqrt(p) + 1;

    if ( (p&1) == 0 )
    {
        t[k] = 2;

        while ( (p&1) == 0 )
            p >>= 1, ++r[k];
        ++k;
    }

    for ( int i = 3; i <= sq; i += 2 )
    {
        if ( p % i == 0 )
        {
            t[k] = i;
            while ( p % i == 0 )
                p /= i, ++r[k];
            ++k;
        }
    }

    if ( p > 1 )
        t[k] = p, r[k++] = 1;
}

long long putere(long long fact, int p)
{
    long long rez = 0;

    while ( fact )
    {
        rez += fact / p;
        fact /= p;
    }

    return rez;
}

int main()
{
    fscanf(in, "%d %d", &p, &q);

    factorizare();

    long long sol = 0;

    for ( int i = 0; i < k; ++i )
    {
        int lo = 1;
        long long hi = r[i] * q;

        long long answ = 0;

        while ( lo <= hi )
        {
            long long m = (lo + hi) >> 1;
            long long b = m * t[i];
            long long z = putere(b, t[i]);

            if ( z > r[i] * q )
                answ = b, hi = m - 1;
            else if ( z < r[i] * q )
                lo = m + 1;
            else
            {
                answ = b;
                break;
            }
        }
        //printf("%d\n", answ);
        if ( answ > sol )
            sol = answ;
    }

    fprintf(out, "%lld\n", sol);

	return 0;
}