Cod sursa(job #881509)

Utilizator Noradllrares stoica Noradll Data 18 februarie 2013 09:32:05
Problema GFact Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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);

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

    p = cp;

	unsigned long long start=2;
	unsigned long long stop=p*q;
	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++)
		{
			int k=0;
			unsigned long long v = val[i];
			for(int j=1;j<=puteri[i];j++)
			{
				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(p==1)
	{
		fprintf(g,"1");
	}
	if(solutie!=0)
	{
		fprintf(g,"%llu",solutie);
	}

	return 0;
}