Pagini recente » Cod sursa (job #1681842) | Cod sursa (job #2344631) | Cod sursa (job #691328) | Cod sursa (job #716729) | Cod sursa (job #1920074)
#include<stdio.h>
using namespace std;
#define INF 2000000000
#define MAXN 44722
int legendre(int n, int d){
int p, s;
p=d; s=0;
while(n/p>=1){
s=s+n/p;
p*=d;
}
return s;
}
int ciur[MAXN], prime[MAXN];
int main(){
FILE*fin=fopen("gfact.in", "r");
FILE*fout=fopen("gfact.out", "w");
int n, p, q, st, dr, d, nr, min, exp, sol, cop, i, j;
fscanf(fin, "%d%d", &p, &q);
ciur[1]=ciur[0]=1;
for(i=2; i*i<=MAXN; i++)
if(ciur[i]==0)
for(j=i*i; j<=MAXN; j+=i)
ciur[j]=1;
j=0;
for(i=1; i<=MAXN; i++)
if(ciur[i]==0){
j++;
prime[j]=i;
}
printf("%d\n", prime[1]);
st=1; dr=INF;
sol=-INF;
while(st<=dr){
n=(st+dr)/2;
d=1;
min=INF;
cop=p;
// printf("DA");
while(prime[d]*prime[d]<=p){
exp=0;
while(p%prime[d]==0){
p/=prime[d];
exp++;
}
if(exp>0){
nr=legendre(n, prime[d]);
if(nr/exp<min)
min=nr/exp;
}
d++;
}
if(p>1){
nr=legendre(n, p);
if(nr<min)
min=nr;
}
if((min/q)>=1){
dr=n-1;
sol=n;
}
else
st=n+1;
p=cop;
}
fprintf(fout, "%d", sol);
return 0;
}