Cod sursa(job #526834)

Utilizator loginLogin Iustin Anca login Data 29 ianuarie 2011 16:56:03
Problema GFact Scor 10
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;

int ok (long long nr)
{
	int pp=1, ex, n;
	for(int i=f[0];pp && i;--i)
	{
		pp=0;
		ex=0;
		for(int j=nr;j;--j)
		{
			n=j;
			while (n%f[i]==0 && ex<e[i])
				++ex, n/=f[i];
		}
		if (ex>=e[i])
			pp=1;
	}
	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()
{
	if (p%2==0)
	{
		f[++f[0]]=2;
		while (p%2==0)p/=2, ++e[f[0]];
		e[f[0]]*=q;
	}
	for(int i=3;p>1;i+=2)
		if (p%i==0)
		{
			f[++f[0]]=i;
			while (p%i==0)p/=2, ++e[f[0]];
			e[f[0]]*=q;
		}
}

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