Cod sursa(job #526640)

Utilizator bora_marianBora marian bora_marian Data 28 ianuarie 2011 23:26:30
Problema GFact Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream>
using namespace std;
struct putere{
	long long val;
	long long nr;};
putere v[50];
int q,p,num;
long long sol=1239023291431235668ll;
void cautare(long long st,long long dr);
void descompune();
long long numarare(long long fact,long long panaN);
bool verifica(long long  val);
int main()
{
	ifstream fin("gfact.in");
	ofstream fout("gfact.out");
	fin>>p>>q;
	descompune();
	//fout<<numarare(2,2000000000000ll)<<endl;
	cautare(1,20000000000000ll);
	fout<<sol;
	return 0;
}
void descompune()
{
	int rid=0,copie=p;
	if(p%2==0)
	{
		while(p%2==0)
		   p=p/2,rid++;
	   v[++num].val=2;
	   v[num].nr=q*rid;
	}
	int i;
	for(i=3;i*i<=copie && p>1;i+=2)
	{
		rid=0;
		if(p%i==0)
		{
			while(p%i==0)
		        p=p/i,rid++;
	        v[++num].val=i;
	        v[num].nr=q*rid;
		}
	}
	if(p>1)
	  v[++num].val=p,v[num].nr=q;
}
void cautare(long long st,long long dr)
{
	if(st==dr)
	{
		if(verifica(st)==1 && st<sol)
		   sol=st;
		return ;
	}
	else
	{
		long long mij=(st+dr)/2;
		if(verifica(mij)==1)
		{  
		    if(mij<sol)
		       sol=mij;
		    cautare(st,mij);
		}
		else
		  cautare(mij+1,dr);
	  }
}
bool verifica(long long val)
{
	int i;
	for(i=1;i<=num;i++)
		if(numarare(v[i].val,val)<v[i].nr)
		  return 0;
	return 1;
}
long long numarare(long long fact,long long panaN)
{
	long long rez=panaN/fact;
	long long copie=rez;
	while(copie>0)
	{
		rez+=copie/fact;
		copie/=fact;
	}
	return rez;
}