Cod sursa(job #212059)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 4 octombrie 2008 11:30:06
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
using namespace std;
#include<fstream>
long long N,copie,prim[12],t=0,P;
void divprim()
{
	long long i;
	copie=N;
	for(i=2;i*i<=N;++i)
		if(copie%i==0)
		{	
			prim[++t]=i;
			while(copie%i==0)
				copie/=i;
		}
	if(copie!=1)
		prim[++t]=copie;
}

void calcul( long long x, long long &nrb,long long &prod)
{
	nrb=0;
	prod=1;
	int i=1;
	while(x)
	{
		if(x&1)
		{
			nrb++;
			prod*=prim[i];
		}
		i++;
		x>>=1;
	}
}	

long long f(long long x)
{
	long long i,prod,nrb,s=0;
	for(i=0;i<(long long)1<<t;++i)
	{
		calcul(i,nrb,prod);
		if(nrb&1)
			s-=x/prod;
		else
			s+=x/prod;
	}
	return s;
}

long long rez()
{
	long long st=1,dr=(long long)1<<(long long)61,m;
	while(st!=dr)
	{
		m=(st+dr)/2;
		if(f(m)>=P)
			dr=m;
		else
			st=m+1;
	}
	return st;
}

int main()
{
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	scanf("%lld%lld",&N,&P);
	divprim();
	printf("%lld\n",rez());
	return 0;
}