Cod sursa(job #161921)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 18 martie 2008 23:14:23
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#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<=x;++i)
	{
		if(p<=1) break;
		if(p%i==0) {++nr; v1[nr]=i;}
		while(!(p%i))
		{
			++v[nr];
			p/=i;
		}
	}
}	
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;	
}