Pagini recente » Cod sursa (job #2771472) | Cod sursa (job #714277) | Cod sursa (job #30018) | Cod sursa (job #1865481) | Cod sursa (job #2364063)
#include <stdio.h>
#define MAXFACT 15
struct Combination {
long long prod;
int ordin;
};
void genComb(int level);
FILE *fin, *fout;
long long fact[MAXFACT + 1];
int numfact = 0;
Combination combs[(1 << MAXFACT) + 1];
int numcombs = 0;
int st[MAXFACT + 1];
long long curprod = 1;
int main() {
fin = fopen("frac.in", "r");
fout = fopen("frac.out", "w");
long long n, p;
fscanf(fin, "%lld%lld", &n, &p);
for(long long i = 2; i * i <= n; i++) {
if(n % i == 0) {
fact[numfact++] = i;
while(n % i == 0) {
n /= i;
}
}
}
if(n > 1) {
fact[numfact++] = n;
}
st[0] = -1;
genComb(1);
long long left = 1, right = (1LL << 60), last = 1;
while(left <= right) {
long long mid = (left + right) / 2;
long long aux = 0;
for(int i = 0; i < numcombs; i++) {
if(combs[i].ordin % 2 == 0) {
aux -= mid / combs[i].prod;
} else {
aux += mid / combs[i].prod;
}
}
if(mid - aux >= p) {
last = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
fprintf(fout, "%lld\n", last);
fclose(fin);
fclose(fout);
return 0;
}
void genComb(int level) {
if(level > 1 && level <= numfact + 1) {
combs[numcombs].prod = curprod;
combs[numcombs++].ordin = level - 1;
}
if(level <= numfact) {
for(int i = st[level - 1] + 1; i < numfact; i++) {
st[level] = i;
curprod *= fact[i];
genComb(level + 1);
curprod /= fact[i];
}
}
}