Cod sursa(job #1722301)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 27 iunie 2016 20:29:10
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#define MAX 6000000
#define INF 2000000005
using namespace std;
char f[MAX];
int pos=0,P,Q,Max=0;
struct fact
{
	int prime,size;
}v[21];
bool X;
void r(int &nr)
{
    nr=0;
    while(f[pos]<'0'||f[pos]>'9')
		pos++;
    while(f[pos]>='0'&&f[pos]<='9')
        nr=nr*10+f[pos++]-'0';
}
void rch(char &ch)
{
    while(f[pos]<'a'||f[pos]>'z')
        pos++;
    ch=f[pos++];
}
bool solve (int val,int pos)
{
	int S=0,x=v[pos].prime;
	while(x<=val)
	{
		S+=val/x;
		x*=v[pos].prime;
	}
	if(S<v[pos].size)
		return false;
	else return true;
}
int binsearch(int ep)
{
	int lw=1,hi=v[ep].size,mid;
	while(lw<=hi)
	{
		mid=(lw+hi)>>1;
		X=solve(mid*v[ep].prime,ep);
		if(X) hi=mid-1;
		else lw=mid+1;
	}
	return lw*v[ep].prime;
}
int main()
{
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout); 
	fread(f,1,MAX,stdin);
	r(P);r(Q);
	int K=P,i=3;
	if(K%2==0)
	{
		v[0].size++;
		v[v[0].size].prime=2;
		while(K%2==0)
			{
				v[v[0].size].size+=Q;
				K/=2;
			}
	}
	while(K>1)
	{
		if(i*i>K)
			i=K;
		if(K%i==0)
		{
			v[0].size++;
			v[v[0].size].prime=i;
			while(K%i==0)
			{
				v[v[0].size].size+=Q;
				K/=i;
			}
		}
		i+=2;
	}
	for(int i=1;i<=v[0].size;i++)
		Max=max(Max,binsearch(i));
	printf("%d",Max);
	return 0;
}