Cod sursa(job #3185302)

Utilizator DeriusSaila Darius Derius Data 18 decembrie 2023 18:01:36
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 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;
            }
        }
        if ( answ > sol )
            sol = answ;
    }
    fprintf(out, "%lld\n", sol);
	return 0;
}