Cod sursa(job #526874)

Utilizator loginLogin Iustin Anca login Data 29 ianuarie 2011 18:08:23
Problema GFact Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
# include <fstream>
# include <iostream>
# define DIM 10000
using namespace std;
int p, q, f[DIM], e[DIM], v[DIM];
long long sol=10000000000000000ll;

int ok (long long nr)
{
	int pp=1, ex;
	long long n;
	for(int i=f[0];pp && i;--i)
	{
		n=nr;
		ex=0;
		while (ex<e[i] && n>1)
			ex+=n/f[i], n/=f[i];
		if (ex<e[i])pp=0;
	}	
	return pp;
}			

void cauta (long long st, long long dr)
{
	if (st==dr)
	{
		if (st<sol && ok(st))
			sol=st;
		return;
	}
	long long mij=(st+dr)/2;
	if (ok(mij))
	{
		sol=mij;
		cauta(st, mij);
	}
	else
		cauta(mij+1,dr);
}

void calc()
{
	int nr=p;
	if (p%2==0)
	{
		f[++f[0]]=2;
		while (nr%2==0)nr/=2, ++e[f[0]];
		e[f[0]]*=q;
	}
	for(int i=3;i*i<=p && nr>1;i+=2)
		if (nr%i==0)
		{
			f[++f[0]]=i;
			while (nr%i==0)nr/=2, ++e[f[0]];
			e[f[0]]*=q;
		}
}		

int main ()
{
	ifstream fin ("gfact.in");
	fin>>p>>q;
	calc();
	cauta (1, 2*p*q);
	ofstream fout ("gfact.out");
	fout<<sol;
	return 0;
}