Pagini recente » Cod sursa (job #1471218) | Cod sursa (job #487825) | Cod sursa (job #837804) | Cod sursa (job #2713853) | Cod sursa (job #1024826)
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
bool ciur[1000000];
int p = 0;
long long m;
long long k;
long long v[78498], w[78498];
void ciurul()
{
long long p, nr=0, j, i, r;
for(i = 2; i <= 1000000; i++)
ciur[i] = true;
r = 1000;
for(p = 2; p <= r; p++)
{
if(ciur[p] == 1)
for(j = p * p; j <= 1000000; j += p)
ciur[j] = false;
}
for(i = 2;i <= 1000000; i++)
if( ciur[i] == true)
{
v[nr] = i;
nr++;
}
}
void factori_primi()
{
int i = 0;
while( v[i] * v[i] <= m)
{
if( m % v[i] == 0)
{
w[p] = v[i]; p++;
while(m % v[i] == 0)
m /= v[i];
}
i++;
}
if(m != 1)
w[p++] = m;
}
long long fi( long long u)
{
long long i,t,r,j;
r = 1;
long long s = 0;
for(i = 0;i < (1<<p); i++)
{ r = 1;
t = 0;
for(j = 0; j <= p - 1; j++)
if((i>>j) % 2 == 1)
{r *= w[j];
t++;}
if(t % 2 == 0)
s += u / r;
else
s -= u / r;
}
return s;
}
long long binary_search()
{
long long i, pas = (long long)1<<61;
for(i = 0; pas; pas >>= 1)
{
if(( fi( i + pas)) <= k - 1)
i += pas;
}
return i + 1;
}
int main()
{
ifstream f("frac.in");
ofstream g("frac.out");
ciurul();
f>>m>>k;
factori_primi();
g<<binary_search();
}