Pagini recente » Cod sursa (job #2926988) | Cod sursa (job #2329200) | Cod sursa (job #519156) | Cod sursa (job #3159811) | Cod sursa (job #349171)
Cod sursa(job #349171)
#include<fstream>
using namespace std;
char prim[5003];
long long p,q,a,b;
int cautare(int l,int r,int div,int putere)
{if(l<r)
{int mij=(l+r)/2;
int aux2=div*mij;
int sum=0;
int imp=div;
while((aux2/imp)!=0) {sum+=aux2/imp;imp*=imp;}
if(sum==putere) return mij;
if(sum<putere) return cautare(l,mij,div,putere);
else return cautare(mij,r,div,putere);
}
}
int main()
{ifstream in("gfact.in");
ofstream out("gfact.out");
in>>p>>q;
for(int i=1;i*i<=p;i++)
prim[i]=1;
for(int i=2;i*i<=p;i++)
for(int j=i+i;j*j<=p;j+=i)
prim[i]=0;
long long aux=p;
int div[5003],puteri[5003]; int nrdiv=0;
if (aux==2) {div[1]=2;nrdiv=1;puteri[1]=1;}
else if(aux==3) {div[1]=3;nrdiv=1;puteri[1]=1;}
else for(int k=2;k*k<=aux;k++)
{if(prim[k]==1 && aux%k==0)
{nrdiv++;div[nrdiv]=k;int contor=0;
while(aux%k==0) {contor++;aux/=k;}
puteri[nrdiv]=contor;
}
}
long long candidat=0;
for(int i=1;i<=nrdiv;i++)
{int cand_aux=cautare(1,q*puteri[i],div[i],puteri[i]*q);
int val=cand_aux*div[i];
if(val>candidat) candidat=val;
}
out<<candidat<<'\n';
return 0;}