Cod sursa(job #1595812)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 10 februarie 2016 15:59:22
Problema GFact Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
using namespace std;

long long exponent(long long prime, long long n)
{
    long long nr = 0;
    while(n!=0)
    {
        nr+=n/prime;
        n/=prime;
    }
    return nr;
}

long long binarySearch(long long st, long long dr, int power, int prime)
{
    if(st==dr)
        return st-st%prime;
    long long mid = (st+dr)/2;
    long long k = exponent(prime, mid);
    if(k==power)
        return mid-mid%prime;
    if(k<power)
        return binarySearch(mid+1,dr,power,prime);
    if(k>power)
        return binarySearch(st,mid-1,power,prime);
}

long long solve(int p, int q)
{
    bool contor = false;
    long long maxim = 0;
    for(int i=2;i*i<=p;i++)
    {
        if(p%i==0)
        {
            contor = true;
            int j=0;
            for(;p%i==0;p/=i, j++);
            long long d = binarySearch(1,2000000000*30000, j*q, i);
            if(d>maxim) maxim = d;
        }
    }
    if(!contor)
    {
        long long d = binarySearch(1,60000000000000, q, p);
        if(d>maxim) maxim = d;
    }
    return maxim;

}

int main()
{
    ofstream out("gfact.out");
    ifstream in("gfact.in");
    int p, q;
    in >> p >> q;
    //out << p << q;
    out << solve(p,q);
    return 0;
}