Cod sursa(job #3234023)

Utilizator tudorhTudor Horobeanu tudorh Data 5 iunie 2024 22:07:34
Problema GFact Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 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]<=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 dd=d[i].val;
        int cnt=0;
        while(val/dd)
        {
            cnt+=val/dd;
            dd*=dd;
        }
        if(cnt<d[i].exp*ex)
            return false;
    }
    return true;
}
ll cb()
{
    ll st=0,dr=p[prime]*30000,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;
}