Cod sursa(job #2690384)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 23 decembrie 2020 20:27:12
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#define MAX 45000
using namespace std;
ifstream cin( "gfact.in" );
ofstream cout( "gfact.out" );
int ciur[ MAX + 1 ];
int d[ MAX ], poz;

long long caut( int div, int exp ){
    long long st = 0, mij, sol;
    long long dr = ( long long )exp * div;
    while( dr - st > 1 ) {
        mij = ( st + dr ) >> 1;
        sol = div;
        int f = 0;
        while( sol <= mij ){
            f += mij / sol;
            sol *= div;
        }
        if( f < exp )
            st = mij;
        else dr = mij;
    }
    return dr;
}

void eratostene(){
    for( int i = 2; i <= MAX; i++ ){
        if( ciur[ i ] == 0 ){
            d[ poz ] = i;
            poz++;
            for( int j = i * i; j <= MAX; j += i )
                ciur[ j ] = 1;
        }
    }
}

int main ()
{
    int i, e, p, q;
    long long sol, b;
    eratostene();
    cin >> p >> q;
    b = 1;
    i = 0;
    while( p > 1 && d[ i ] * d[ i ] <= p ){
        e = 0;
        while( p % d[ i ] == 0 ){
            p /= d[ i ];
            e++;
        }
        e *= q;
        if( e > 0 ){
            sol = caut( d[ i ], e );
            if ( sol > b )
                b = sol;
        }
        i++;
    }
    if( p > 1 ){
        sol = caut( p, q );
        if ( sol > b )
            b = sol;
    }
    cout << sol << '\n';
    return 0;
}