Cod sursa(job #2632840)

Utilizator George1Simion George George1 Data 5 iulie 2020 11:28:24
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <cmath>
#include <fstream>

using namespace std;

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

long long fact[50000],putere[50000],rez;

long long verif(long long nrdiv, long long q, long long b)
{
    for (long long i=1; i<=nrdiv; i++)
    {
        long long factor=fact[i];
        long long aux=b;
        long long nrp=0;

        while (aux>0)
        {
            nrp=nrp+(aux/factor);
            aux=aux/factor;
        }
        if (nrp < putere[i]*q)
        {
            return 0;
        }
    }

    return 1;
}

void caut_bin(long long nrdiv, long long q, long long p)
{
    long long st=1,dr=(long long)1 << 60;
    while (st <= dr)
    {
        long long mij=(st+dr)/2;

        if (verif(nrdiv,q,mij) == 1)
        {
            rez=mij;
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
}

int main()
{
    long long p,q,nrdiv=0,d,put;
    f>>p>>q;

    d=2;
    while (d*d <= p)
    {
        put=0;
        while (p%d==0)
        {
            p=p/d;
            put=put+1;
        }
        if (put>0)
        {
            nrdiv=nrdiv+1;
            fact[nrdiv]=d;
            putere[nrdiv]=put;
        }
        d=d+1;
    }

    if (p>1)
    {
        nrdiv=nrdiv+1;
        fact[nrdiv]=p;
        putere[nrdiv]=1;
    }

   caut_bin(nrdiv, q, p);
   g<<rez<<'\n';
    return 0;
}