Cod sursa(job #1003271)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 30 septembrie 2013 10:23:17
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<fstream>
using namespace std;
int P,Q,fact[100],e[100],nrf;

inline bool Ok(long long B)
{
	int i;
	long long p,nr;
	for(i=1;i<=nrf;i++)
	{
		p=fact[i];
		nr=0;
		while(B>=p && nr<1LL*e[i])
		{
			nr+=B/p;
			p*=1LL*fact[i];
		}
		if(nr<1LL*e[i])
			return false;
	}
	return true;
}

inline long long CautareBinara()
{
	long long st,dr,mij,rez;
	st=0;
	dr=rez=1000000000000000000LL;
	while(st<=dr)
	{
		mij=(st+dr)/2LL;
		if(Ok(mij))
		{
			rez=mij;
			dr=mij-1LL;
		}
		else
			st=mij+1LL;
	}
	return rez;
}

int main()
{
	int i;
	ifstream fin("gfact.in");
	fin>>P>>Q;
	fin.close();
	
	if(P%2==0)
	{
		fact[++nrf]=2;
		while(P%2==0)
		{
			e[nrf]++;
			P/=2;
		}
		e[nrf]*=Q;
	}
	i=3;
	while(i*i<=P)
	{
		if(P%i==0)
		{
			fact[++nrf]=i;
			while(P%i==0)
			{
				e[nrf]++;
				P/=i;
			}
			e[nrf]*=Q;
		}
		i+=2;
	}
	if(P>1)
	{
		fact[++nrf]=P;
		e[nrf]=Q;
	}
	
	ofstream fout("gfact.out");
	fout<<CautareBinara()<<"\n";
	fout.close();
	return 0;
}