Cod sursa(job #526630)

Utilizator bora_marianBora marian bora_marian Data 28 ianuarie 2011 22:26:11
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<fstream>
using namespace std;
struct putere{
	int val;
	int nr;};
putere v[50];
int q,p,num;
long long sol=12390232914312356ll;
void cautare(int st,long long dr);
void descompune();
int numarare(int fact,long long panaN);
bool verifica(int val);
int main()
{
	ifstream fin("gfact.in");
	ofstream fout("gfact.out");
	fin>>p>>q;
	descompune();
	//for(int i=1;i<=num;i++)
	  // fout<<v[i].val<<" "<<v[i].nr<<endl;
	cautare(1,10000000000ll);
	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(int 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(int val)
{
	int i;
	for(i=1;i<=num;i++)
		if(numarare(v[i].val,val)<v[i].nr)
		  return 0;
	return 1;
}
int numarare(int fact,long long panaN)
{
	int rez=panaN/fact;
	int copie=rez;
	while(copie>0)
	{
		rez+=copie/fact;
		copie/=fact;
	}
	return rez;
}