Pagini recente » Cod sursa (job #2517566) | Cod sursa (job #1051710) | Cod sursa (job #2649690) | Cod sursa (job #152339) | Cod sursa (job #129681)
Cod sursa(job #129681)
#include <stdio.h>
long long n, p, ans, div[32], min, mid, max, sol, nr, s = 1;
void bkt(int k);
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
int i;
long long temp;
scanf("%lld %lld", &n, &p);
temp = n;
for(i = 2; i * i <= n; ++i)
{
if(temp % i == 0)
{
div[++div[0]] = i;
}
while(temp % i == 0)
temp /= i;
}
if(temp != 1)
{
div[++div[0]] = temp;
}
min = 0;
max = (long long) 2000000000 * 2000000000;
while(min <= max)
{
sol = 0;
mid = (min + max) / 2;
bkt(1);
//printf("%lld %lld\n", mid, sol);
if(sol < p)
{
min = mid + 1;
}
else if(sol == p)
{
ans = mid;
max = mid - 1;
}
else
{
max = mid - 1;
}
}
printf("%lld\n", ans);
return 0;
}
void bkt(int k)
{
if(k == div[0] + 1)
{
if(nr % 2 == 0)
{
sol += mid / s;
}
else
{
sol -= mid / s;
}
}
else
{
bkt(k + 1);
++nr;
s *= div[k];
bkt(k + 1);
--nr;
s /= div[k];
}
}