Cod sursa(job #526379)

Utilizator matei_cChristescu Matei matei_c Data 28 ianuarie 2011 10:35:55
Problema Frac Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<stdio.h>
#include<math.h>
int factprimi[100000001],produs[100000001];
long long n,p,num,k=0;

void descompunere()
{
	long long i;
	for(i=2;i*i<=n;i++)
	{	
		if(n%i==0)
		{	
			factprimi[k++]=i;
			while(n%i==0)
				n/=i;
		}	
	}		
	if(n!=1)
		factprimi[k++]=n;
}
void PRODUS()
{
	long long prod,nr,i,j;
	for (i=0;i<(1<<k);i++)
	{
		prod=1;
		nr=i;
		for(j=0;nr>0;j++,nr/=2)
		{
			if (nr%2==1)
				prod*=-factprimi[j];
		}	
		produs[i]=prod;
	}
}
long long functie(long long x)
{
	long long nr=0,i;
	for(i=0;i<(1<<k);i++)
		nr+=x/produs[i];
	return nr;
}
int main()
{
	long long st=1,dr=(long long)pow(2,61),m;
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	scanf("%lld%lld",&n,&p);
	descompunere();
	PRODUS();
	while(st<=dr)
	{
		m=(st+dr)/2;
		if(functie(m)>=p)
		{
			num=m;
			dr=m-1;
		}
		else
			st=m+1;
	}	
	printf("%lld\n",num);
	return 0;
}