Cod sursa(job #250550)

Utilizator mottyMatei-Dan Epure motty Data 31 ianuarie 2009 10:46:38
Problema GFact Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#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;
}