Cod sursa(job #249010)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 27 ianuarie 2009 11:49:42
Problema GFact Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#define N 100000005   
long long p,q;
void citire()
{
	scanf("%lld%lld",&p,&q);
}
bool prim(int n)   
{   
    int i;   
    if (n<2)   
        return false;   
    if (n==2)   
        return true;   
    if (n%2==0)   
        return false;   
    for (i=3; i*i<=n; i+=2)   
        if (n%i==0)   
            return false;   
    return true;   
}   
int fact(int p,int q)
{
	int s=0,i,t;
	for (i=q; i<=p; i+=q)
		if (i%q==0)
		{
			t=i;
			while(t%q==0)
			{
				t/=q;
				s++;
			}
		}
	return s;
}
int calcul(int r,int k)
{
	int st=1,dr=r*k,m;
	while (st!=dr)
	{
		m=(st+dr)/2;
		if (fact(m,k)==r)
			return m/k*k;
		else
			if (fact(m,k)<r)
				st=m+1;
			else
				dr=m;
	}
	return 0;
}
void desc()
{
	int i,putere;
	long long nr=0,max=0;
	if (prim(p) && q==1)
		printf("%lld",p);
	else
	{
	for (i=2; i*i<=p ;i++)
		if (p%i==0)
		{
			putere=0;
			while (p%i==0)
			{
				p/=i;
				putere++;
			}
			nr=calcul(putere*q,i);
			if (nr>max)
				max=nr;
		}
	if (p!=1)
	{
		nr=calcul(1*q,p);
			if (nr>max)
				max=nr;
	}
	printf("%lld",max);
	}
}
int main()
{
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	citire();
	desc();
	return 0;
}