Cod sursa(job #433529)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 3 aprilie 2010 19:53:02
Problema GFact Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>
#define infile "gfact.in"
#define outfile "gfact.out"
#define nrmax 13131
int a[nrmax]; //a[i]=al i-lea numar prim din descompunere
int b[nrmax]; //b[i]=puterea la care apare
int p,q; //A=p^q
int nr; //numarul de numere prime din descompunerea lui p (implicit si a lui A)
long long x=1; //valoarea B cautata

void read()
{
	scanf("%d %d\n",&p,&q);
}

void init()
{
	int i;
	
	//il descompunem pe p in factori primi
	for(i=2;i*i<=p;i++)
		if(p%i==0)
		{
			a[++nr]=i;
			while(p%i==0) b[nr]++,p/=i;
		}
	if(i<=p) ++nr,a[nr]=p,b[nr]=1;
		
	//ridicam descompunerea la puterea q
	for(i=1;i<=nr;i++)
		b[i]*=q;
}

 int putere(long long x, long long y)
{
	long long z=y;
	//puterea la care apare y in x!
	long long nr=0;
	while(z<=x) nr+=x/z,z*=y;
	return (int)nr;
}

long long cbin(long long st, long long dr, int x, int y)
{
	//cautam binar rezultatul
	long long val=0,mij;
	while(st<=dr)
	{
		mij=(st+dr)>>1;
		if(putere(mij,x)>=y) val=mij,dr=mij-1;
		else st=mij+1;
	}
	return val;
}

void solve()
{
	int i;
	
	for(i=1;i<=nr;i++)
		if(putere(x,a[i])<b[i])
			x=cbin(x+1,(long long)a[i]*b[i],a[i],b[i]);
}

void write()
{
	printf("%lld\n",x);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	solve();
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}