Cod sursa(job #2282742)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 14 noiembrie 2018 14:22:35
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#define ND 10
#define L 45
using namespace std;
ifstream in ("gfact.in");
ofstream out ("gfact.out");
int p,q,d[ND],e[ND],nd;
void descompunere(int n)
{
    int div=2;
    while(div*div<=n)
    {
        if(n%div==0)
        {
            d[nd] = div;
            while(n % div == 0)
            {
                e[nd]++;
                n/=div;
            }
            nd++;
        }
        div++;
    }
    if(n > 1)
    {
        d[nd] = n;
        e[nd++]=1;
    }
}
long long putere(long long n,int p)
{
    /*
    returneaza puterea la care pot sa il ridi 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 hatz)
{
    //verific daca n! este divizibil cu p^q folosind d si e
    for(int i=0; i < nd; i++)
    {
        if(putere(hatz,d[i]) < e[i] * q)
            return false;
    }
    return true;
}

long long cautb()
{
    long long r=0,pas = 1LL << L;
    while(pas)
    {
        if(!divfact(r+pas))
            r += pas;
        pas >>= 1;
    }
    return r+1;
}
int main()
{
    in>>p>>q;
    in.close();
    descompunere(p);
    out<<cautb();
    out.close();
    return 0;
}