Pagini recente » Cod sursa (job #2772738) | Cod sursa (job #1547541) | Cod sursa (job #1112911) | Cod sursa (job #559146) | Cod sursa (job #1809345)
#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;
}