Cod sursa(job #504709)

Utilizator DEYDEY2Tudorica Andrei DEYDEY2 Data 28 noiembrie 2010 15:16:17
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.7 kb
#include <cstdio>
long long n,p,cont;
int prim[20];

void d() {
	long long i;
	for(i=2; i*i<=n; i++)
		if(!(n%i)) {
			prim[++cont]=i;
			while(!(n%i)) n/=i;
		}
	if(n>1) prim[++cont]=n;
}

long long f(long long x) {
	int i, j, lim = (1 << cont) - 1;
	long long nr = 0, p;
	
	for (i = 0; i <= lim; i ++) {
		p = 1;
		
		for (j = 1; j <=cont; j ++) if (i & (1 << j - 1)) p=p * -1 * prim[j];
		
		nr=nr+x/p;
	}
	
	return nr;
}

int main()
{
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	scanf("%lld %lld",&n,&p);
	d();
	long long st=0,dr=1LL<<61,m,sol=0;
	for(m=(st+dr)/2;st<=dr;m=(st+dr)/2) {
		if (f (m) >= p) {
			sol = m;
			dr = m - 1;
		}
		else st = m + 1;
	}
	printf("%lld\n",sol);
	return 0;
}