Pagini recente » Cod sursa (job #3210496) | Cod sursa (job #2578710) | Cod sursa (job #2699496) | Cod sursa (job #532163) | Cod sursa (job #2164861)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
int M, nr, x[50], k,poz;
long long N,P,rez,divs[50],m,sol;
int pr[80000];
bool v[1000005];
void ciur(long long n)
{
int i, j;
v[0]=1;
v[1]=1;
for(i=4; i<=n; i+=2)
v[i] = 1;
for(i=3; i*i<=n; i+=2)
{
if(v[i]==0)
for(j=i*i; j<=n; j+=i)
v[j]=1;
}
pr[1]=2;
nr=1;
for(int i=3; i<=n; i+=2)
if(v[i]==0)
pr[++nr]=i;
}
void add(int n, long long A)
{
int s=1;
long long p=1;
for(int i=1; i<=n; i++)
if(x[i]==1)
{
s*=-1;
p*=divs[i];
}
rez+=s*A/p;
}
void backt(int n)
{
k=1;
x[1]=-1;
while(k>0)
if(x[k]<1)
{
x[k]++;
if(k==n)
add(n,m);
else
{
k++;
x[k]=-1;
}
}
else
k--;
}
void cb()
{
long long p=1,u=1LL<<61;
while(p<=u)
{
rez=0;
m=(p+u)/2;
backt(poz);
if(rez<P) p=m+1;
else
{
sol=m;
u=m-1;
}
}
g<<sol;
}
void solt()
{
for(int crt=1; crt<=nr && 1LL*pr[crt]*pr[crt]<=N; crt++)
if(N%pr[crt]==0)
{
divs[++poz]=pr[crt];
do
{
N/= pr[crt];
}
while(N%pr[crt]==0);
}
if(N>1)
{
divs[++poz]=N;
}
rez=0;
cb();
}
int main()
{
f>>N>>P;
ciur(1000005);
solt();
return 0;
}