Cod sursa(job #88909)

Utilizator victorsbVictor Rusu victorsb Data 4 octombrie 2007 19:16:56
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <cmath>

#define Nmax 16
#define ll long long

int ct;
ll sir[Nmax];
ll n, p;

void citire()
{
	scanf("%lld %lld", &n, &p);
}

ll count(ll nr)
{
	int mask, cnt, i;
	ll d;
	ll ret = 0;

	for (mask = 0; mask < 1 << ct; ++mask)
	{
		cnt = 0;
		d = 1;
		for (i = 1; i <= ct; ++i)
			if ((mask >> (i - 1)) & 1)
			{
				d *= sir[i];
				++cnt;
			}

		if (cnt % 2 == 0)
			ret += nr / d;
		else
			ret -= nr / d;
	}

	return ret;
}

void solve()
{
	int i, rad = (int)sqrt(n);
	ll t = n, st, dr, mij, sol = 0;

	for (i = 2; i <= rad; ++i)
		if (t % i == 0)
		{
			sir[++ct] = i;
			while (t % i == 0)
				t /= i;
		}

	if (t != 1) sir[++ct] = t;

	st = 1;
	dr = 1;
	dr <<= 62;

	while (st <= dr)
	{
		mij = (st + dr) >> 1;

		if (count(mij) >= p)
		{
			sol = mij;
			dr = mij - 1;
		}
		else
			st = mij + 1;
	}

	printf("%lld\n", sol);
}

int main()
{
	freopen("frac.in", "r", stdin);
	freopen("frac.out", "w", stdout);

	citire();
	solve();

	return 0;
}