Cod sursa(job #353468)

Utilizator pirvupirvu tudor pirvu Data 5 octombrie 2009 12:05:05
Problema GFact Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<cstdio>

int v[1000];

int c[1000];

int n2;

void descompunere(int p)
{
	if (p%2==0) v[++v[0]]=2;
	while (p%2==0) { c[v[0]]++; p/=2;}
	for (int i=3;i*i<=p;i+=2)
	{
		if (p%i==0) 
			v[++v[0]]=i;
		while (p%i==0)  
		{ 
			c[v[0]]++; 
			p/=i;
		}
	}
	
	if (p>1)
	{
		v[++v[0]]=p;
		c[v[0]]=1;
	}
	c[0]=v[0];
}




bool nrz( int n, int a, int b)//verific daca a (prim) apare la o putere >=b in desc lui n!
{
	int b2=0;
	while(n)
		b2 += (n/=a);
	return b2>=b;
}

bool div( int n)
{
	for (int i=1;i<=v[0];i++)
		if (!nrz(n,v[i],c[i]) ) return 0;
	return 1;
}


int caut()
{
	int i,pas;
	for (pas=1;pas<=n2;pas<<=1); // Puterea lui 2 <n
	for (i=0;pas;pas>>=1)
		if (!div(i+pas) ) i+=pas;
	
	return i+1;
}



int main()
{
	
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	int p,q;
	scanf("%d%d", &p , &q);

	descompunere(p);
	
	for (int i=1;i<=v[0];i++)
		c[i]*=q;
	
	n2=p;
	
	int c2=caut();
	
	printf("%d", c2);
	
	
	return 0;
}