Cod sursa(job #1972823)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 23 aprilie 2017 19:44:17
Problema GFact Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>

using namespace std;

ifstream fin("gfact.in");
ofstream fout("gfact.out");

int i,k,q;
int st,dr,mid;
unsigned long long p,b,nrb,maxim;

unsigned long long legendre(unsigned long long x, unsigned long long y)
{
    unsigned long long sol = 0;
    while (x/y != 0)
    {
        sol += x/y;
        y *= y;
    }
    return sol;
}

int main()
{
    fin >> p >> q;
    for (i=2; i*i<=p; i++)
        if (p%i == 0)
        {
            long long nr = 0;
            while (p != 1)
                p /= i, nr++;
            st = 1;
            dr = nr*q;
            while (st <= dr)
            {
                mid = (st+dr)/2;
                b = mid*i;
                nrb = legendre(b, i);
                if (nrb == nr*q)
                    break;
                else
                    if (nrb < nr*q)
                        st = mid+1;
                    else
                        dr = mid-1;
            }
            maxim = max(maxim, b);
        }
    if (p != 1)
    {
        st = 1;
        dr = q;
        while (st <= dr)
        {
            mid = (st+dr)/2;
            b = mid*p;
            nrb = legendre(b, p);
            if (nrb == q)
                break;
            else
                if (nrb < q)
                    st = mid+1;
                else
                    dr = mid-1;
        }
        maxim = max(maxim, b);
    }
    fout << maxim;
    return 0;
}