Pagini recente » Cod sursa (job #2966902) | Cod sursa (job #462158) | Cod sursa (job #1832530) | Cod sursa (job #726875) | Cod sursa (job #186318)
Cod sursa(job #186318)
#include <fstream>
#include <cmath>
using namespace std;
#define MAX 50
long long prim[MAX], cntprim, x[MAX];
long long N,P, aux, NR, prod;
void fact( long long x)
{
long long nr = 2;
while ( x > 1 )
{
if ( x % nr == 0 )
{
prim[cntprim++] = nr;
for ( ; x % nr == 0; x /=nr);
}
if ( nr > (int) sqrt(x))
nr = x;
else
nr++;
}
}
void back(int k, int n)
{
if ( k==n+1)
aux+= NR / prod;
else
for ( int i = x[k-1]+1; i<cntprim; i++)
{
x[k] = i;
prod *= prim[i];
back(k+1, n);
prod /= prim[i];
}
}
long long sum(int cnt)
{
aux =0;
x[0] = -1;
prod = 1;
back(1,cnt);
return aux;
}
long long numara( long long nr )
{
long long rez = 0;
NR = nr;
for (int i = 1; i<=cntprim; i++)
if ( i % 2 == 1 )
rez+= sum(i);
else
rez-=sum(i);
return NR-rez;
}
long long b_search()
{
long long st= 1, dr = (long long )1<<61, rez=-1;
while ( st <= dr )
{
long long mid = (st+dr)>> 1;
long long c = numara(mid);
if ( c >= P )
{
dr = mid - 1;
rez = mid;
}
else
st = mid +1;
}
return rez;
}
int main()
{
ifstream fin("frac.in");
ofstream fout("frac.out");
fin>>N>>P;
fact(N);
long long rez = b_search();
fout<<rez<<"\n";
return 0;
}