Cod sursa(job #470509)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 14 iulie 2010 12:24:45
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define file_in "frac.in"
#define file_out "frac.out"

long long n,p;
int q[1000],nr;

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%lld %lld", &n, &p);
}	

long long verif(long long x)
{
	int i,j;
	long long sol=0;
	long long prod;
	
	for (i=1;i<(1<<nr);++i)
	{
		nr=0;
		prod=1;
		for (j=1;j<=nr;++j)
			 if (i&(1<<(j-1)))
			 {
				 nr++;
				 prod*=q[j];
			 }
			 if (nr&1)
				  sol+=x/prod;
			 else
				 sol-=x/prod;
	}
	
	return sol;
}

void solve()
{
	int j;
	long long i,ls,ld,mij,sol;
	for (i=2;i*i<n;++i)
		 if (n%i==0)
		 {
			 q[++nr]=n/i;
			 q[++nr]=i;
		 }
		 if (i*i==n)
			 q[++nr]=n;
		 sort(q+1,q+nr+1);
	ls=0;
    ld=1LL<<62;
	while(ls<=ld)
	{
		mij=(ls+ld)>>1;
		if (verif(mij)>=p)
		{
			sol=mij;
			ld=mij-1;
		}
		else
			ls=mij+1;
	}
	
	printf("%lld\n", sol);
}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}