Pagini recente » Cod sursa (job #949616) | Cod sursa (job #2519388) | Cod sursa (job #2719721) | Cod sursa (job #348859) | Cod sursa (job #3155163)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
long long st, dr = 1e18;
long long d[12]; // d[1].....d[n]
int nr, s[12];
long long n, poz, ans; /// ans = nr de numere neprime cu n;
bool ciur[1000001];
int p[200000]; // p[1]=2 p[2]=3 .......p[cnt]<=1 000 000
int cnt;
void ciur_eratostene()
{
ciur[0] = 1;
ciur[1] = 1;
for (int i = 2; i*i <= 1000001; i++)
if (!ciur[i])
{
for (int j = i; i * j <= 1000001; j++)
ciur[ i*j ]=1;
}
for (int i = 2; i <= 1000001; i++)
if (!ciur[i])
p[++cnt] = i;
}
void produs(int k, long long a)
{
long long p = 1;
for(int i = 1; i<= k; i++)
p *= d[s[i]];
if(k%2==0)
ans = ans - a/p;
else
ans += (a/p);
}
void bkt(int k, int l, long long a)
{
for (int i = s[k-1]+1 ; i <= nr+k-l; i++)
{
s[k] = i;
if (k == l)
produs(k, a);
else
bkt(k + 1, l, a);
}
}
int main()
{
in >> n >> poz;
ciur_eratostene();
//cout<<cnt<<'\n';
for(int i=1; i<=cnt && p[i]*p[i]<=n; i++)
if(n%p[i]==0)
{
d[++nr]=p[i];
while(n%p[i]==0)
n/=p[i];
}
if(n>1)
{
nr++;
d[nr]=n;
}
ans=0;
for(int i=1; i<=nr; i++)
bkt(1, i, dr);
long long nr_prime_cu_n_sub_p = 1;
long long nr_prime_cu_n_peste_p = ans;
while(st<=dr)
{
long long mij = (st+dr)/2;
ans=0;
for(int i=1; i<=nr; i++)
bkt(1, i, mij);
ans=mij-ans;
//cout << mij << " " << ans << endl;
if(ans==poz-1)
{
while(ans==poz-1)
{
mij++;
ans=0;
for(int i=1; i<=nr; i++)
bkt(1, i, mij);
ans=mij-ans;
}
out << mij;
break;
}
else if(ans>poz-1)
dr = mij-1;
else
st = mij+1;
}
return 0;
}