Cod sursa(job #526881)

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

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

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()
{
	long long 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;
		}
	if (nr>1)f[++f[0]]=nr,e[f[0]]=q;
}		

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