Cod sursa(job #2286817)

Utilizator HappyFox_12Antonia Onisoru HappyFox_12 Data 20 noiembrie 2018 20:38:00
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>

using namespace std;

const int ND = 10, L = 45;

int p, q, d[ND], e[ND], nd;

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

void descompunere(int n)
{
    int dv = 2;
    while (dv * dv <= n)
    {
        if (n % dv == 0)
        {
            d[nd] = dv;
            while (n % dv == 0)
            {
                e[nd]++;
                n /= dv;
            }
            nd++;
        }
        dv++;
    }
    if (n > 1)

    {
        d[nd] = n;
        e[nd++] = 1;
    }
}
long long putere(long long n, int p)
{
    ///returneaza puterea la care pot sa.l ridic pe p ai sa.l divida pe n!
    long long r = 0;
    while (n >= p)
    {
        r += n / p;
        n /= p;
    }
    return r;
}

bool divfact(long long n)
{
    ///verifica daca n! e divizibil cu p la q folosind d si e
    for (int i = 0; i < nd; i++)
    {
        if (putere(n, d[i]) < e[i] * q)
            return false;
    }
    return true;
}
long long cautb()
{
    long long r = 0, pas = 1LL << L;
    while (pas != 0)
    {
        if (!divfact(r + pas))
                r += pas;
        pas /= 2;
    }
    r++;
    return r;

}
int main()
{

    in >> p >> q;
    descompunere(p);
    out << cautb();
    return 0;

}