Cod sursa(job #635231)

Utilizator sebii_cSebastian Claici sebii_c Data 18 noiembrie 2011 21:12:26
Problema Frac Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#define PMAX 100

long long div[PMAX];
long long prod, n, p, result;
int nr, nd;

void back(int k, long long m)
{
	int i;
	for (i = 0; i <= 1; ++i) {
		if (i == 1) {
			prod *= div[k];
			++nr;
		}
		if (k == nd) {
			if (nr % 2 == 1)
				result -= m/prod;
			else
				result += m/prod;
		}
		else
			back(k + 1, m);
		if (i == 1) {
			prod /= div[k];
			--nr;
		}
	}
}

long long try(long long m)
{
	result = 0;
	prod = 1;
	nr = 0;
	back(1, m);
	return result;
}

long long binary_search(long long low, long long high)
{	
	long long res;
	long long mid;
	long long pos = high + 1;
	while (low <= high) {
		mid = (low + high)/2;
		res = try(mid);
		if (res >= p) {
			high = mid - 1;
			pos = mid;
		}
		else
			low = mid + 1;
	}
	return pos; 
}

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

	scanf("%lld %lld", &n, &p);	
	long long aux = n;
	long long i;
	for (i = 2; i * i <= aux; ++i)
		if (n % i == 0) {
			div[++nd] = i;
			while (n % i == 0)
				n /= i;
		}
	if (n > 1) 
		div[++nd] = n;
	
	long long h = (long long) 1 << 61;
	long long result = binary_search(1, h);
	printf("%lld\n", result);
	
	return 0;
}