Cod sursa(job #913366)

Utilizator XeBluePodaru Mihai XeBlue Data 13 martie 2013 13:09:33
Problema GFact Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>

using namespace std;

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

long long p, q, b[100], e[100], numar;

void citire();
long long descompunere(long long n);
void construire();
long long cauta();
bool verifica(long long n);

int main()
{
    citire();
    descompunere(p);
    construire();
    out << cauta();

    in.close();
    out.close();
    return 0;
}

void citire() { in >> p >> q ;}

long long descompunere(long long n)
{
    long long i=2, k;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            k=0;
            while(!n%i)
            {
                n/=i;
                k++;
            }
            numar++;
            b[numar]=i;
            e[numar]=k;
        }
    }
    if(n!=1)
    {
        numar++;
        b[numar]=n;
        e[numar]=1;
    }
}

void construire()
{
    for(int f=1;f<=numar;f++)
        e[f]*=q;
}

long long cauta()
{
    long long i=0, pas= 1LL<<60;
    while(pas!=0)
    {
        if(!verifica(i+pas))
            i+=pas;
        pas>>=1;
    }
    return i+1;
}

bool verifica(long long n)
{
    long long i, exp, aux;
    bool r = true;
    for(i=1;i<=numar;i++)
    {
        aux=n;
        exp=0;
        while(aux>=b[i])
        {
            exp+=aux/b[i];
            aux/=b[i];
        }
        if(exp<e[i])
            r = false;
    }
    return r;
}