Pagini recente » Cod sursa (job #3343486) | Cod sursa (job #3332986) | Cod sursa (job #3343564) | Cod sursa (job #3346243) | Cod sursa (job #3312152)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin ("frac.in");
ofstream fout ("frac.out");
bool IsPrime [1000002];
vector <int> primes;
void Ciur(){
IsPrime[0] = 0;
IsPrime[1] = 0;
for (int i=2;i<=1000000;++i){
IsPrime[i] = 1;
}
for (int i=2;i<=1000000;++i){
if (IsPrime[i]==1){
for (int j=2*i;j<=1000000;j+=i){
IsPrime[j] = 0;
}
}
}
for (int i=2;i<=1000000;++i){
if (IsPrime[i]==1) primes.push_back(i);
}
}
void Get_Fact(int B,vector <int> &fct){
int cB = B;
for (auto x:primes){
if (cB%x==0) fct.push_back(x);
while (cB%x==0){
cB /= x;
}
}
if (cB>1){
fct.push_back(cB);
}
}
int Query(int A,int B){
vector <int> fct;
Get_Fact(B,fct);
int n = fct.size();
int ans = 0;
for (int mask=0;mask<(1<<n);++mask){
int m_prod = 1;
int cnt = 0;
int val = 1;
for (int bit=0;bit<n;++bit){
if (mask&(1<<bit)){
val *= fct[bit];
cnt++;
}
}
m_prod = A/val;
int Ior_I = 1;
if (cnt%2==1) Ior_I = -1;
ans += m_prod*Ior_I;
}
return ans;
}
signed main()
{
Ciur();
int n,p;
fin >> n >> p;
int L = 1,R = (1LL<<61);
int ans = 0;
while (L<R){
int M = (L+R)/2;
if (Query(M,n)<p) L = M+1;
else{
R = M;
ans = M;
}
}
fout << L;
return 0;
}