Pagini recente » Cod sursa (job #1383869) | Cod sursa (job #337798) | Cod sursa (job #953047) | Cod sursa (job #1472340) | Cod sursa (job #124541)
Cod sursa(job #124541)
#include<stdio.h>
FILE *f=fopen("gfact.in","r"),
*g=fopen("gfact.out","w");
long long p,q,b,i,j,k,pr[89000],t,pu,ok,o,v[50],m,a,var,rev,c;
int main()
{ fscanf(f,"%lld %lld",&p,&q);
pr[1]=2; b=p;
while(p%2==0) p/=2;
k=1;ok=1;
if(p==1) pu=2,ok=0,p=b;
i=3;
if(ok){ while(pr[k]*pr[k]<=b&&ok){ o=1;
for(j=2;pr[j]*pr[j]<i&&o;++j) if(i%pr[j]==0) o=0;
if(o) { pr[++k]=i;
if(p%pr[k]==0) { while(p%pr[k]==0) p/=pr[k];
if(p==1) ok=0;
pu=pr[k];
}
}
i+=2;
}
if(p>1) pu=b;
p=b;t=0;v[1]=1;i=1;
while(b%pu==0) b/=pu,++t;m=1;
t*=q;
}
else { while(b%pu==0) b/=pu,++t;
t*=q;
}
v[1]=1; i=1;b=p;m=1;
while(v[i]<p*q) ++i,v[i]=v[i-1]*pu,++m;
a=1;b=p*q;
var=2;ok=1;
while(b-a>=pu&&ok) { c=(a+b)/2+1;
rev=0;
for(i=2;i<=m;++i) rev+=c/v[i];
if(rev<t) a=c;
else if(rev>t) if(b!=c)b=c;
else ok=0;
else ok=0;
}
while(c%pu) --c;
fprintf(g,"%lld\n",c);
fclose(f);
fclose(g);
return 0;
}