Cod sursa(job #3234025)

Utilizator tudorhTudor Horobeanu tudorh Data 5 iunie 2024 23:15:52
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
bitset <45000> e;
int p[45000],prime,divz,ex;
using ll=long long;
struct divizori
{
    int val,exp;
}d[45000];
void era()
{
    for(int i=2; i<=45000; i++)
        if(!e[i])
        {
            p[++prime]=i;
            for(int j=i;(ll)i*j<=45000;j++)
                e[i*j]=1;
        }
}
void desc(int n)
{
    int pos=1;
    while((ll)p[pos]*p[pos]<=n && pos<=prime)
    {
        int exp=0;
        while(n%p[pos]==0)
        {
            n/=p[pos];
            exp++;
        }
        if(exp)
            d[++divz]={p[pos],exp};
        pos++;
    }
    if(n!=1)
        d[++divz]={n,1};
}
bool check(ll val)
{
    for(int i=1;i<=divz;i++)
    {
        ll cnt=0;
        ll vall=val;
        while(vall/d[i].val)
        {
            cnt+=vall/d[i].val;
            vall/=d[i].val;
        }
        if(cnt<d[i].exp*ex)
            return false;
    }
    return true;
}
ll cb()
{
    ll st=0,dr=(ll)d[divz].val*d[divz].exp*ex,mid,r=-1;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(check(mid))
        {
            r=mid;
            dr=mid-1;
        }
        else st=mid+1;
    }
    return r;
}
int main()
{
    ifstream fin("gfact.in");
    ofstream fout("gfact.out");
    int b;
    fin>>b>>ex;
    era();
    desc(b);
    fout<<cb();
    return 0;
}