Pagini recente » Cod sursa (job #1001836) | Cod sursa (job #1237253) | Cod sursa (job #2344929) | Cod sursa (job #381385) | Cod sursa (job #557931)
Cod sursa(job #557931)
#include <fstream>
#include <math.h>
#define nmax 500000
#define mmax 1 << 20
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
int nr, d, v[nmax];
long long n, p, m;
long long sol;
void calcul()
{
int g = m;
float val = sqrt(g);
d = 2;
nr = 0;
while(g > 1)
{
if(g % d == 0)
v[++nr] = d;
while(g % d == 0)
g /= d;
if(d > val && g > 1)
{
v[++nr] = g;
g = 1;
}
if(d == 2) d+=1;
else d+=2;
}
}
int pinex()
{
sol = m;
for(int i = 1; i < (1 << nr); ++ i)
{
int rez = 0;
int p = 1;
for(int j = 0; j < nr; ++ j)
if(i & (1 << j))
{
++ rez;
p = 1LL * p * v[j+1];
}
if(rez % 2) rez = -1;
else rez = 1;
sol = sol + 1LL * rez * m/p;
}
return sol;
}
int main()
{
long long st, dr;
fin >> n >> p;
st = 1;
dr = mmax;
// m = 14;
// calcul();
// fout << pinex() << "\n";
while(st <= dr)
{
calcul();
m = (st+dr)/2;
if(pinex() -1 == p)
{
fout << m+1 << "\n";
return 0;
}
else if(pinex() - 1< p)
st = m + 1;
else dr = m - 1;
}
return 0;
}