Cod sursa(job #1595885)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 10 februarie 2016 16:51:44
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
using namespace std;
ofstream out("gfact.out");
    ifstream in("gfact.in");
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)
{
    //out << st << " " << dr << "\n";
    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++);
            if(p!=1) contor = false;
            long long d = binarySearch(1,60000000000000, 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()
{

    int p, q;
    in >> p >> q;
    //out << p << q;
    out << solve(p,q);
    return 0;
}