Cod sursa(job #462677)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 12 iunie 2010 16:46:23
Problema Frac Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
long long n, p;
int prim[20];

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

long long fractii (long long x)
{
	int i, j, p, lim = (1 << prim[0]) - 1;
	long long nr = 0;
	
	for (i = 0; i <= lim; i ++)
	{
		p = 1;
		
		for (j = 1; j <= prim[0]; 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", &n, &p);
	desc ();
	
	long long st = 0, dr = 1LL << 61, m, sol = 0;
	
	while (st <= dr)
	{
		m = (st + dr) >> 1;
		if (fractii (m) >= p)
		{
			sol = m;
			dr = m - 1;
		}
		else
			st = m + 1;
	}
	
	while (fractii (sol) < p && fractii (sol - 1) < p)
		sol ++;
	
	printf ("%lld\n", sol);
	return 0;
}