Cod sursa(job #2356223)

Utilizator adiaioanaAdia R. adiaioana Data 26 februarie 2019 16:12:07
Problema GFact Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>

using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
struct chestie{
    long long e,nr;
}fact[100];
long long dr,mij,rez,mn,k,st,ok,p,q;;
bool verif(long long x);
void scanandprec();
long long power(long long x,long long e);
int main()
{
    scanandprec();
    st=p;
    dr=q*p;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        ok=verif(mij);
        if(ok==1)
        {
            rez=mij;
            dr=mij-1;
        }
        else st=mij+1;
    }
    cout<<rez<<'\n';
    return 0;
}
long long power(long long x,long long e)
{
    if(e==0)
        return 1;
    long long P=power(x,e/2);
    if(e%2==1)
        return P*P*x;
    return P*P;
}
bool verif(long long x){

    long long pp,rasp,NR,init;
    mn=2000000000;

    for(long long i=1;i<=k;i++)
    {
        NR=init=fact[i].nr;
        rasp=0;
        while(NR<=x)
            rasp+=(x/NR),NR=NR*init;
        if(rasp<fact[i].e*q)
            return 0;

    }
    return 1;
}
void scanandprec()
{
    cin>>p>>q;
    k=0;
    long long n=p;
    if(n%2==0)
    {
        ++k;
        while(n%2==0&&n)
            fact[k].e++,n/=2;
        fact[k].nr=2;
    }
    for(long long d=3; d*d<=n; d+=2)
        if(n%d==0)
        {
            ++k;
            while(n%d==0&&n)
                fact[k].e++,n/=2;
            fact[k].nr=d;
        }
    if(n>1)
        fact[++k].nr=n,fact[k].e=1;
}