Pagini recente » Cod sursa (job #619511) | Istoria paginii runda/danbarbilian2011 | Cod sursa (job #1822270) | Cod sursa (job #2905008) | Cod sursa (job #508287)
Cod sursa(job #508287)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
const char iname[] = "gfact.in";
const char oname[] = "gfact.out";
ifstream fin(iname);
ofstream fout(oname);
long long p,q,fc,d,ct[45000],st,dr,mj,rez,factor[45000],nr[45000],mx;
long long k,i;
int calc(int vl,int k)
{
int mult,x,nom=0,sm=0;
mult=factor[k];
x=vl;
if(factor[k]>0)
while(x>=mult)
{
nom=x/mult;
mult*=factor[k];
sm+=nom;
}
return sm;
}
int main()
{
fin>>p>>q;
fc=p,d=2;
//factorizam p si numar
int ct2=0;
while(fc>1 && ct2==0)
{
if(fc%d==0)
{
if(d>sqrt(p))
ct2++;
fc=fc/d;
if(ct[d]==0)
factor[++k]=d;
ct[d]++;
}
else
d++;
}
for(i=1;i<=k;i++)
{
st=1;
dr=q*ct[factor[i]];
mj=0,rez=0;
while(st<dr)
{
mj=(st+dr)/2;
rez=calc(mj*factor[i],i);
if(rez>ct[factor[i]]*q)
dr=mj;
else
if(rez<ct[factor[i]]*q)
st=mj+1;
else
break;
}
nr[i]=mj*factor[i];
}
for(i=1;i<=k;i++)
if(nr[i]>mx)
mx=nr[i];
fout<<mx<<"\n";
return 0;
}