Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 60 si 61 | Cod sursa (job #15741) | Cod sursa (job #564936) | Cod sursa (job #636673) | Cod sursa (job #161924)
Cod sursa(job #161924)
#include <stdio.h>
#include <math.h>
#define N 200000
#define INF 2000000000
int v[N],v1[N];
int nr=0;
void descompune(int p)
{
int x=p;
for(int i=2;i*i<=x;++i)
{
if(p<=1) break;
if(p%i==0) {++nr; v1[nr]=i;}
while(!(p%i))
{
++v[nr];
p/=i;
}
}
if(p>1)
{
++nr;
v1[nr]=p;
++v[nr];
}
}
void ridica_la_putere(int p, int q)
{
for(int i=1;i<=nr;++i)
if(v[i]!=0)
v[i]*=q;
}
long long solve(int p, int q)
{
long long k,i,j=0;
long long max=0;
for(i=1;i<=nr;++i)
{
if(v[i]>0)
for(j=v1[i];j<=INF;j+=v1[i])
{
k=j;
while(!(k%v1[i]))
{
--v[i];
k/=v1[i];
}
if(v[i]<=0)
break;
}
if(j>max) max=j;
}
return max;
}
int main()
{
int p,q;
long long rez;
freopen("gfact.in", "r",stdin);
freopen("gfact.out", "w",stdout);
scanf("%d %d", &p, &q);
descompune(p);
ridica_la_putere(p,q);
/*for(int i=1;i<=nr;++i)
if(v[i]!=0)
printf("%d %d %d\n", v[i],v1[i],i);
printf("\n");*/
rez=solve(p,q);
printf("%lld\n", rez);
return 0;
}