Cod sursa(job #3275013)

Utilizator Antonio8Mincu Antonio Alexandru Antonio8 Data 8 februarie 2025 17:58:51
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
const long long VMIN = 1;
const long long VMAX = 60000000000000LL;
const int NMAX = 10;
int dp[NMAX], pdp[NMAX], ndp, p, q;
void descompunere(int n){
    int d = 2;
    while(d * d <= n){
        if(n % d == 0){
            dp[ndp] = d;
            while(n % d == 0){
                pdp[ndp]++;
                n /= d;
            }
            ndp++;
        }
        d++;
    }
    if(n != 1){
        dp[ndp] = n;
        pdp[ndp] = 1;
        ndp++;
    }
}
long long putere(long long n, int d){
    long long ct = 0;
    while(n >= d){
        ct += n / d;
        n /= d;
    }
    return ct;
}
bool se_divide(long long n){
    for(int i = 0; i < ndp; i++){
        if(putere(n, dp[i]) < pdp[i] * q){
            return 0;
        }
    }
    return 1;
}
long long cb(){
    long long st = VMIN, dr = VMAX, rez = VMAX + 1;
    while(st <= dr){
        long long m = (st + dr) / 2;
        if(se_divide(m)){
            rez = m;
            dr = m - 1;
        } else {
            st = m + 1;
        }
    }
    return rez;
}
int main(){
    fin >> p >> q;
    descompunere(p);
    fout << cb();
    fin.close();
    fout.close();
    return 0;
}