Cod sursa(job #1842079)
Utilizator | Data | 6 ianuarie 2017 14:37:56 | |
---|---|---|---|
Problema | GFact | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.57 kb |
#include<cstdio>
#include<values.h>
int main()
{
unsigned long long p,q,a,sol,j,nr,r,k=2,x,maxx=0,pr,i,m;
FILE*fin=fopen("gfact.in","r");
FILE*fout=fopen("gfact.out","w");
fscanf(fin,"%llu %llu",&p,&q);
for(k=2; k*k<=p; ++k)
{
r=0;
while(p%k==0)
{
++r;
p/=k;
}
if(r!=0)
{
r=r*q;
i=1;
j=2*r*k;
while(i<=j)
{
m=(i+j)/2;
nr=0;
pr=k;
while((m/pr)!=0)
{
nr+=(m/pr);
pr*=k;
}
if(nr==r)
{
while(m%k!=0)
m--;
break;
}
else if(nr>r)
j=m-1;
else
i=m+1;
}
if(m>maxx)
maxx=m;
}
}
if(p>1)
{
k=p;
r=q;
i=1;
j=2*r*k;
while(i<=j)
{
m=(i+j)/2;
nr=0;
pr=k;
while((m/pr)!=0)
{
nr+=(m/pr);
pr*=k;
}
if(nr==r)
{
while(m%k!=0) m--;
break;
}
else if(nr>r) j=m-1;
else i=m+1;
}
if(m>maxx)
maxx=m;
}
fprintf(fout,"%llu",maxx);
return 0;
}