Cod sursa(job #1334670)
Utilizator | Data | 4 februarie 2015 16:03:38 | |
---|---|---|---|
Problema | GFact | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 4.13 kb |
#include<cstdio>
#include<math.h>
using namespace std;
int prim(int x)
{
if(x==0||x==1)
return 0;
else
{
if(x==2)
return 1;
else
{
if(x%2==0)
return 0;
else
{
int lim=(int)sqrt(x);
for(int i=3; i<=lim; i=i+2)
{
if(x%i==0)
return 0;
}
}
}
}
return 1;
}
int putere(int a,int b)
{
if(b==0)
return 1;
else
{
int nr=1;
for(int i=1; i<=b; ++i)
{
nr*=a;
}
return nr;
}
}
int fact(int a,int b)
{
int nr=0;
while(b%a==0)
{
b/=a;
nr++;
}
return nr;
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
int p,q,lim,x,max=0,j,a,b,c,k,i;
scanf("%d%d",&p,&q);
if(prim(p)==1)
{
for(j=1; j<=31; ++j)
{
if(putere(p,j)>=(q*(p-1)+1))
{
if(j==1&&max<p)
max=p;
else
{
a=putere(p,j-1);
b=a/(p-1);
c=putere(p,j);
for(k=a+p; k<=c; k=k+p)
{
b+=fact(p,k);
if(b>=q)
{
if(max<k)
max=k;
break;
}
}
}
break;
}
}
}
else
{
lim=(int)sqrt(p);
for(i=2; i<=lim; ++i)
{
if(prim(i)==1&&p%i==0)
{
x=0;
while(p%i==0)
{
p/=i;
x++;
}
x*=q;
for(j=1; j<=31; ++j)
{
if(putere(i,j)>=(x*(i-1))+1)
{
if(j==1&&max<i)
max=i;
else
{
a=putere(i,j-1);
b=a/(i-1);
c=putere(i,j);
for(k=a+i; k<=c; k=k+i)
{
b+=fact(i,k);
if(b>=x)
{
if(max<k)
max=k;
break;
}
}
}
break;
}
}
if(prim(p)==1)
{
for(j=1; j<=31; ++j)
{
if(putere(p,j)>=(q*(p-1)+1))
{
if(j==1&&max<p)
max=p;
else
{
a=putere(p,j-1);
b=a/(p-1);
c=putere(p,j);
for(k=a+p; k<=c; k=k+p)
{
b+=fact(p,k);
if(b>=q)
{
if(max<k)
max=k;
break;
}
}
}
}
}
break;
}
else
{
if(p==1)
break;
}
}
}
}
printf("%d",max);
return 0;
}