Pagini recente » Cod sursa (job #293879) | Cod sursa (job #505596) | Cod sursa (job #108044) | Cod sursa (job #783630) | Cod sursa (job #1842987)
#include <stdio.h>
using namespace std;
long long i, j, n, p, q, pr, l, r, mid, nr, pq[10][255];
int vp[10];
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
scanf("%d%d", &n, &p);
long long nn = n;
for(i = 2; i*i <= n; i++)
if(!(n % i))
{
vp[++vp[0]] = i;
while(!(n % i)) n/=i;
}
if(n > 1) vp[++vp[0]] = n;
for(i = 1; i < (1 << vp[0]); i++)
{
pr = 1;
q = 0;
for(j = 0; (1 << j) <= i; j++)
if(i & (1 << j))
{
pr *= vp[j+1];
q++;
}
pq[q][++pq[q][0]] = pr;
}
r = 1LL << 61;
while(l < r)
{
mid = l + (r - l) / 2;
nr = mid;
for(i = 1; i <= vp[0]; i++)
for(j = 1; j <= pq[i][0]; j++)
if(i % 2)
nr -= mid / pq[i][j];
else
nr += mid / pq[i][j];
if(nr == p) r = mid;
else if (nr < p) l = mid + 1;
else r = mid - 1;
}
printf("%d", r);
}