Pagini recente » Cod sursa (job #1494421) | Cod sursa (job #171139) | Cod sursa (job #2472897) | Cod sursa (job #1466828) | Cod sursa (job #807155)
Cod sursa(job #807155)
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <vector>
#define MAX (1LL << 62)
#include <math.h>
using namespace std;
vector <long long> diviz;
long solut[20000];
long long n;
long long p;
long long sum = 0;
long long prod = 1;
void prime(long long x,long last)
{
for (long val=solut[last-1]+1;val<=diviz.size();val++)
{
solut[last] = val;
prod *= diviz[solut[last]-1];
sum += ((int)pow(-1,last-1) * (x / prod));
prime(x,last+1);
prod /= diviz[solut[last]-1];
}
}
int main()
{
FILE *input = fopen("frac.in","r");
FILE *output = fopen("frac.out","w");
fscanf(input,"%lld",&n);
fscanf(input,"%lld",&p);
long long div = 1;
long long cpy = n;
while (cpy != 1)
{
div++;
if (cpy % div == 0)
{
diviz.push_back(div);
while (cpy % div == 0)
{
cpy /= div;
}
}
}
long long st = 0;
long long dr = MAX;
long long sol = 0;
while (st <= dr)
{
long long m = (st + dr ) / 2;
solut[0]= 0;
sum = 0;
prod = 1;
prime(m,1);
sum = m - sum;
if (sum >= p)
{
sol = m;
dr = m-1;
}
else
{
st = m+1;
}
}
fprintf(output,"%lld",sol);
fclose(input);
fclose(output);
return 0;
}