Cod sursa(job #1776195)

Utilizator silkMarin Dragos silk Data 10 octombrie 2016 23:57:36
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#define NMax 15
#define ll long long

ll temp[NMax+1];
ll f[NMax+1];
ll g[NMax+1];

bool is_good(ll X)
{
    int i;
    ll x,expn;
    for(i = 1; i <= NMax; ++i) temp[i] = 0;
    for(i = 1; i <= f[0]; ++i)
    {
        expn = 0; x = f[i];
        while( X >= x )
        {
            expn += X/x;
            x = x * f[i];
        }
        temp[i] = expn;
    }
    for(i = 1; i <= g[0]; ++i)
    if( temp[i] < g[i] ) return 0;
    return 1;
}

int main(){
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);

    int i,aux,P,Q;
    ll st,mid,dr,B;

    scanf("%d %d",&P,&Q);

    for(i = 2; i * i <= P; ++i)
    if( P % i == 0 )
    {
        aux = 0;
        while( P % i == 0 ) { ++aux; P/=i; }
        f[ ++f[0] ] = i;
        g[ ++g[0] ] = aux;
    }
    if( P > 1 ) { f[ ++f[0] ] = P; g[ ++g[0] ] = 1; }

    for(i = 1; i <= g[0]; ++i) g[i] = g[i] * Q;

    for(st = 1, dr = 1LL<<59; st <= dr; )
    {
        mid = (st+dr)/2;
        if( is_good(mid) ) { B = mid; dr = mid - 1; }
        else st = mid + 1;
    }

    printf("%lld\n", B);



return 0;
}