Cod sursa(job #1951134)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 3 aprilie 2017 14:19:22
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>

int P, Q, divisor[1025], power[1025], k;

inline void factorize(int P){

    if(P % 2 == 0){
        divisor[++k] = 2;
        while(P % 2 == 0) power[k]++, P /= 2;
    }

    for(int i = 3; i * i <= P; i += 2){
        if(P % i == 0){
            divisor[++k] = i;
            while(P % i == 0) power[k]++, P /= i;
        }
    }

    if(P > 1) divisor[++k] = P, power[k] = 1;
}

inline long long get_power(long long number, int divisor){
    long long result = 0;

    for(long long i = divisor; i <= number; i *= divisor){
        result += number / i;
    }return result;
}

inline bool check(long long B){

    for(int i = 1; i <= k; i++){
        if(get_power(B, divisor[i]) < power[i]){
            return false;
        }
    }return true;
}

inline long long find(){

    long long low = 1, high = 60000000000000, result;

    while(low <= high){

        long long middle = (low + high) / 2;

        if(check(middle) == false){
            low = middle + 1;
        }else{
            result = middle;
            high = middle - 1;
        }
    }
    return result;
}

int main(){

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

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

    factorize(P);

    for(int i = 1; i <= k; i++){
        power[i] *= Q;
    }

    printf("%lld", find());

    return 0;
}