Pagini recente » Cod sursa (job #2363199) | Cod sursa (job #237308) | Cod sursa (job #2545267) | Cod sursa (job #1653016) | Cod sursa (job #2656155)
#include <fstream>
#include <bitset>
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
/*
ifstream cin("ciorna.in");
ofstream cout("ciorna.out");*/
const int nmax=44723;
bitset <nmax> c;
unsigned int p,q,nr[4653]= {1,2},fact[14],exp[14],dim,cp;
//4647
bool ok(unsigned long long ceva){
for (unsigned int i=1;i<=dim;++i){
unsigned long long cnt=0,lim=exp[i]*q;
for (unsigned long long j=fact[i];j<=ceva and cnt<lim;j*=fact[i])
cnt+=ceva/j;
if (cnt<lim)
return 0;
}
return 1;
}
int bs(unsigned long long st, unsigned long long dr){
unsigned long long last;
while (st<=dr){
//cout<<st<<' '<<dr<<'\n';
unsigned long long med=((st+dr)>>1);
if (ok(med))
{
last=med;
dr=med-1;
}
else st=med+1;
}
return last;
}
int main()
{
for (int i=3; i<=nmax; i+=2)
if (!c[i])
{
nr[++nr[0]]=i;
for (int j=i*i; j<=nmax; j+=(i<<1))
c[j]=1;
}/*
int cnt=0;
for (int i=2; i<=nmax; ++i)
cnt+=!c[i];*/
cin>>p>>q;
cp=p;
for (unsigned int i=1;i<=nr[0] and nr[i]*nr[i]<=p;++i)
{
if (p%nr[i])
continue;
fact[++dim]=nr[i];
for (;p%nr[i]==0;p/=nr[i]) exp[dim]++;
}
if (p>1){
fact[++dim]=p;
exp[dim]=1;
}
/*
2000000000 30000 1080015
123456 30000 19260422
111111111 29999 10009676333
*/
cout<<bs(1,1ULL*cp*q);
}