Cod sursa(job #2096640)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 29 decembrie 2017 15:39:47
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>
using namespace std;

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

#define p first
#define q second

int P, Q;
vector<pair<int, int>> fact;

long long ans;

void descompunere();

bool check(int arg, int p, int q)
{
    int nr = 0;
    long long tmp = p, lim = 1LL * arg * p;
    while(tmp <= lim)
    {
        nr += lim / tmp;
        tmp *= 1LL * p;
    }

    return (nr >= Q * q);
}

int main()
{
    in >> P >> Q;

    descompunere();

    for(auto it: fact)
    {
        int st = 1, dr = it.q * Q, last = -1;
        while(st <= dr)
        {
            int med = (st + dr) / 2;
            if(check(med, it.p, it.q))
            {
                dr = med - 1;
                last = med;
            }
            else st = med + 1;
        }

        ans = max(ans, 1LL * last * it.p);
    }

    out << ans << '\n';

    return 0;
}

void descompunere()
{
    int putere;
    for(int d = 2; d * d <= P && P > 1; d++)
    {
        putere = 0;
        while(P % d == 0)
        {
            P /= d;
            putere++;
        }
        if(putere)
            fact.push_back({d, putere});
    }

    if(P > 1)
        fact.push_back({P, 1});
}