Cod sursa(job #2282739)

Utilizator alexcmoteaalexcmotea alexcmotea Data 14 noiembrie 2018 14:20:21
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>

#include <fstream>



using namespace std;



const int ND = 10;

const int L = 45;



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



ifstream in;

ofstream 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 a.i.

    ///sa-l divida pe n!

    long long r = 0;

    while (n >= p)

    {

        r += n / p;

        n /= p;

    }

    return r;

}



bool divfact(long long n)

{

    ///verific daca n! e divizibil cu p^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.open("gfact.in");

    in >> p >> q;

    in.close();

    descompunere(p);

    out.open("gfact.out");

    out << cautb();

    out.close();

    return 0;

}