Cod sursa(job #2669621)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 7 noiembrie 2020 12:46:54
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <bits/stdc++.h>
using namespace std;
int p, q, d[15], e[15], nd;
long long ans;
void desc(int n)
{
    int dv = 2;
    while(dv * dv <=n){
        if (n%dv==0){
            d[nd] = dv;
            while(n%dv==0){
                e[nd] ++;
                n /= dv;
            }
            nd ++;
        }
        dv ++;
    }
    if (n > 1){
        d[nd] = n;
        e[nd++] = 1;
    }
}
long long pwr(long long n, int p)
{
    long long r = 0;
    while(n >= p){
        r += n/p;
        n /= p;
    }
    return r;
}
bool divfact(long long n)
{
    for (int i=0;i<nd;i++){
        if (pwr(n, d[i]) < e[i] * q)
            return false;
    }
    return true;
}
long long caut()
{
    long long r = 0, step = 1LL << 45;
    while(step){
        if (!divfact(r + step))
            r += step;
        step /= 2;
    }
    r ++;
    return r;
}
int main() {
    freopen("gfact.in", "r", stdin);
    freopen("gfact.out", "w", stdout);
    scanf("%d%d", &p, &q);
    desc(p);
    ans = caut();
    printf("%lld", ans);
    return 0;
}