Cod sursa(job #2269951)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 26 octombrie 2018 20:13:09
Problema GFact Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>

using namespace std;

int div[10000] ;
int put[10000] ;
int p, q ;

void divizori(int a) {
    int d(2) ;
    while (d * d <= a) {
        if (!(a % d)) {
            div[++ div[0]] = d ;
            while (!(a % d))
                a /= d, put[div[0]] ++ ;
        }
        d ++ ;
    }
    if (a > 1) {
        div[++ div[0]] = a ;
        put[div[0]] ++ ;
    }
}

bool ver(long long x) {
    long long s(0), k ;
    register int i ;
    for (i = 1 ; i <= div[0] ; ++ i) {
        k = div[i] ;
        while (x / k > 0) {
            s += x/k ;
            k *= div[i] ;
        }
        if (s < put[i] * q)
            return 0 ;
    }
    return 1 ;
}

int caut(int a, int b) {
    long long pas(0), L(1LL << 60) ;
    while (L != 0) {
        if (!ver(pas + L))
            pas += L ;
        L /= 2 ;
    }
    return pas + 1 ;
}

int main()
{
    freopen("gfact.in","r",stdin) ;
    freopen("gfact.out","w",stdout) ;
    scanf("%d %d", &p, &q) ;
    divizori(p) ;
    printf("%d",caut(p, q)) ;
    return 0;
}