Cod sursa(job #1972831)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 23 aprilie 2017 20:05:24
Problema GFact Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>

using namespace std;

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

int k;
long long st,dr,mid;
long long p,b[1000],i,q;
long long nrbi,maxim;
pair <long long, long long> v[1000];

long long legendre(long long x, long long y)
{
    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;
            k++;
            while (st <= dr)
            {
                mid = (st+dr)/2;
                b[k] = mid*i;
                nrbi = legendre(b[k], i);
                if (nrbi == nr*q)
                    break;
                else
                    if (nrbi < nr*q)
                        st = mid+1;
                    else
                        dr = mid-1;
            }
        }
    if (p != 1)
    {
        st = 1;
        dr = q;
        k++;
        while (st <= dr)
        {
            mid = (st+dr)/2;
            b[k] = mid*p;
            nrbi = legendre(b[k], p);
            if (nrbi == q)
                break;
            else
                if (nrbi < q)
                    st = mid+1;
                else
                    dr = mid-1;
        }
    }
    for (i=1; i<=k; i++)
    {
        st = 1;
        dr = v[i].second*q;
        while (st <= dr)
        {
            mid = (st+dr)/2;
            b[i] = mid*v[i].first;
            nrbi = legendre(b[k], v[i].first);
            if (nrbi == v[i].second*q)
                break;
            else
                if (nrbi < v[i].second*q)
                    st = mid+1;
                else
                    dr = mid-1;
        }
    }
    for (i=1; i<=k; i++)
        maxim = max(maxim, b[i]);
    fout << maxim;
    return 0;
}