Cod sursa(job #1296720)

Utilizator vladrochianVlad Rochian vladrochian Data 21 decembrie 2014 14:15:59
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <fstream>
using namespace std;

typedef long long lld;
const int kMaxDiv = 11, kMaxConf = 1030;

ifstream fin("frac.in");
ofstream fout("frac.out");

lld N, P;
int nrf, conf;
lld f[kMaxDiv], val[kMaxConf];

lld Count(lld lim) {
	lld ans = 0;
	for (int i = 0; i < conf; ++i)
		ans += lim / val[i];
	return ans;
}

lld BinarySearch() {
	lld ans = 0, step = 1LL << 60;
	while (step) {
		if (Count(ans | step) < P)
			ans |= step;
		step >>= 1;
	}
	return ans + 1;
}

int main() {
	fin >> N >> P;
	for (lld i = 2; i * i <= N; ++i)
		if (N % i == 0) {
			f[nrf++] = i;
			while (N % i == 0)
				N /= i;
		}
	if (N > 1)
		f[nrf++] = N;
	conf = 1 << nrf;
	for (int i = 0; i < conf; ++i) {
		val[i] = 1;
		for (int j = 0; j < nrf; ++j)
			if (i & (1 << j))
				val[i] *= -f[j];
	}
	fout << BinarySearch() << "\n";
	return 0;
}