Cod sursa(job #1809345)

Utilizator aaether14Dinescu Stefan Cristian aaether14 Data 18 noiembrie 2016 20:54:13
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>


bool non_prime[110000];
long long prime[110000];
long long primes = -1;


long long num_factors = -1;
long long factors[100];

long long n,p;


int main()
{

	std::ifstream fin("frac.in");
	std::ofstream fout("frac.out");
	fin>>n>>p;
	for (long long i = 2;  i <= 110000; ++i)
	{
		if (!non_prime[i])
		{
			prime[++primes] = i;		
			for (long long j = 2; j * i <= 110000; ++j)
				non_prime[j*i] = true;
		}
	}

	for (long long i = 0; i <= primes; ++i)
	{
		if (!(n%prime[i]))
			factors[++num_factors] = prime[i];
		while (!(n%prime[i]))
			n/=prime[i];
	}
	if (n > 1)
		factors[num_factors = 0] = n;


	long long left = 1;
	long long right = 1ll << 62;
	long long mid;
	long long current_factor;
	long long should_add;
	long long result;
	while (left < right)
	{
		mid = (left + right) >> 1;
		result = mid;
		for (long long i = 1; i < (1ll << (num_factors+1)); ++i)
		{
			current_factor = 1ll;
			should_add = 0ll;
			for (long long j = 0; j <= num_factors; ++j)
				if (i & 1ll << j)
				{
					++should_add;
					current_factor *= factors[j];
				}
			if (should_add & 1)
				result -= mid/current_factor;
			else
				result += mid/current_factor;

		}

		if (result < p)
			left = mid + 1;
		else if (result > p)
			right = mid - 1;
		else
			right = mid;
	}

	fout << left;
	fin.close();
	fout.close();
	return 0;

}