Pagini recente » Borderou de evaluare (job #2863669) | Cod sursa (job #1445363) | Cod sursa (job #1984014) | Borderou de evaluare (job #765087) | Cod sursa (job #250550)
Cod sursa(job #250550)
#include<stdio.h>
#include<stdlib.h>
#define MARE 41
#define MIC 18
int p,q,ar;
struct f_d{
long long x,y;
};
struct f_p{
int a,b;
};
f_p c[MIC];
void fact_prim()
{
int k;
for( int i=2 ; i*i<=p ; ++i )
if( p%i==0 )
{
for( ar++,k=0,c[ar].a=i ; p%i==0 ; ++k,p/=i );
c[ar].b=k;
}
if(p!=1)
c[++ar].a=p;
c[ar].b=1;
}
long long v_maker(int a,int b)
{
f_d v[MARE];
long long k=0;
int i=0;
v[i].x=a;
v[i].y=1;
while(v[i].y<b)
{
i++;
v[i].x = a * v[i-1].x;
v[i].y = v[i-1].x + v[i-1].y;
}
while (b)
{
k+= b / v[i].y * v[i].x;
b%= v[i--].y;
}
return k;
}
void calcul()
{
long long z,max=0;
for( int i=1 ; i<=ar ; ++i )
{
//printf("%d\n",c[i].a);
z=v_maker(c[i].a , c[i].b*q);
//printf("z=%lld\n",z);
if(z>max)
max=z;
}
printf("%lld\n",z);
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%d%d",&p,&q);
fact_prim();
calcul();
return 0;
}