Pagini recente » Cod sursa (job #2887626) | Cod sursa (job #220268) | Cod sursa (job #1357819) | Cod sursa (job #447124) | Cod sursa (job #73395)
Cod sursa(job #73395)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int p, q, nn, nr, bc, ex, rz;
int wop(int a, int b){
int s = 1;
for (int i=1; i<=b; i++)
s*=a;
return s;
}
struct ches{
int b, e;
};
ches v[1000];
int comp(const void*x, const void*y){
ches xx=*(ches*)x, yy=*(ches*)y;
int a1 = wop(xx.b, xx.e), a2 = wop(yy.b, yy.e);
if (a1<a2) return -1;
if (a1>a2) return 1;
return 0;
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
int i, sqr, k, p1;
scanf("%d%d", &p, &q);
sqr = sqrt(p);
p1 = p;
for (i=2;i<=sqr;i++)
if (p1%i==0){
v[++nr].b = i;
k = 0;
do{
k++;
p/=i;
}
while (p%i==0);
v[nr].e = k;
}
if (p1!=1){
v[++nr].b = p1;
v[nr].e = 1;
}
qsort(v, nr+1, sizeof(v[0]), comp);
bc = v[nr].b;
ex = v[nr].e*q;
rz = ex*(bc-1)+1;
nn = 0;
do{
rz/=bc;
nn++;
}
while (rz>bc);
int s1, a;
long long li = wop(bc, nn), ls = li*bc, pz, gs = 0;
while (!gs){
pz = (li+ls)/2;
a = bc;
s1 = 0;
while (pz/a != 0){
s1+=pz/a;
a*=bc;
}
if (s1 < ex)
li = pz+1;
else
if (s1 > ex)
ls = pz-1;
else
gs = pz;
}
printf("%lld\n", pz);
fclose(stdin);
fclose(stdout);
return 0;
}