Cod sursa(job #881519)

Utilizator Noradllrares stoica Noradll Data 18 februarie 2013 09:53:19
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
int main()
{
	FILE* f=fopen("gfact.in","r");
	FILE* g=fopen("gfact.out","w");
	int p,q;
	fscanf(f,"%d%d",&p,&q);

	if(p==1)
	{
		fprintf(g,"1");
		return 0;
	}

	unsigned long long produs = (unsigned long long)p * (unsigned long long)q;

	int puteri[50];
	int val[50];
	int n=0;
	for(int i=2;i<=sqrt((float)p);i++)
	{
		if (p%i==0)
		{
			puteri[n]=0;
			val[n]=i;
			while(p%i==0)
			{
				puteri[n]++;
				p/=i;
			}
			n++;
		}
	}
	if(p > 1) {
		val[n]=p;
		puteri[n]=1;
		n++;
	}
	for(int i=0;i<n;i++)
	{
		puteri[i]*=q;
	}

	for(int i=0;i<n;i++)
	{
		//fprintf(g,"%d %d\n",val[i],puteri[i]);
	}

	unsigned long long start=2;
	unsigned long long stop=produs;
	unsigned long long mijloc;

	unsigned long long solutie=0;

	while(stop>=start)
	{
		mijloc=(stop+start)/2;

		bool gasit=false;
		for(int i=0;i<n;i++)
		{
			unsigned long long k=0;
			unsigned long long v = val[i];
			while(v<=mijloc)
			{
				k+=mijloc/v;
				v *= val[i];
				if(k>=puteri[i])
				{
					break;
				}
			}
			if(k<puteri[i])
			{
				gasit=true;
			}
		}
			
		if(!gasit)
		{
			solutie = mijloc;
			stop=mijloc-1;
		} 
		else
		{
			start=mijloc+1;
		}
	}

	if(solutie!=0)
	{
		fprintf(g,"%llu",solutie);
	}

	return 0;
}