Cod sursa(job #573588)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 6 aprilie 2011 13:31:15
Problema Frac Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include<stdio.h>
#include<math.h>
long w,i,j,nn,k,nr2,jj;
long long s[10000],n,m,e[10000],st,dr,x,nr;
long long nr_indiv(long long x)
{long long s1=0;
	for(long i=1;i<=w;++i)
	   {s1+=(x/s[i]);}
	return (x-s1);	
}
int main()
{
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	if(n==1){printf("%lld\n",m);return 0;}
	nn=sqrt(n);
	for(i=2;i<=nn;++i)
		if(n%i==0)
		{
			e[++k]=i;
			while(n%i==0){n/=i;}
		}
	if(n!=1)e[++k]=n;
	w=(1<<k)-1;
	for(i=1;i<=w;++i)
	{
		nr2=0;s[i]=1;
		for(j=1,jj=1;j<=i;j*=2,jj++)
		{
			if((i&j)>0)s[i]*=e[j],nr2++;
		}
		if(nr2%2==0)s[i]=-s[i];
	}
	st=1;
	dr=(1ll<<61);
	while(st<dr)
	{
		x=(st+dr)/2;
		nr=nr_indiv(x);
		if(nr>=m)dr=x;
		else st=x+1;
	}
	printf("%lld\n",dr);
	return 0;
}