Pagini recente » Cod sursa (job #863742) | Cod sursa (job #3218544) | Cod sursa (job #1099580) | Monitorul de evaluare | Cod sursa (job #1097995)
#include <fstream>
#include <iostream>
#include <vector>
#include <bitset>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <set>
#include <map>
#include <string>
#include <queue>
#include <deque>
using namespace std;
const char infile[] = "frac.in";
const char outfile[] = "frac.out";
ifstream fin(infile);
ofstream fout(outfile);
const int MAXN = 100005;
const int oo = 0x3f3f3f3f;
typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator It;
const inline int min(const int &a, const int &b) { if( a > b ) return b; return a; }
const inline int max(const int &a, const int &b) { if( a < b ) return b; return a; }
const inline void Get_min(int &a, const int b) { if( a > b ) a = b; }
const inline void Get_max(int &a, const int b) { if( a < b ) a = b; }
int N, P;
vector <int> d;
inline bool Check(const long long &value) {
int N = static_cast<int>(d.size());
long long maxConf = (1LL << N);
long long Ans = 0;
long long _count = 0;
for(int conf = 1 ; conf < maxConf; ++ conf) {
_count = 1;
short _sgn = -1;
for(int i = 0 ; i < N ; ++ i) {
if(conf & (1 << i)) {
_count *= 1LL * d[i];
_sgn *= -1;
}
}
Ans += 1LL * value * _sgn / _count;
}
return value - Ans < P;
}
int main() {
fin >> N >> P;
for(int i = 2 ; i * i <= N ; ++ i) {
if(N % i == 0) {
d.push_back(i);
while(N % i == 0)
N /= i;
}
}
if(N > 1)
d.push_back(N);
long long li = 0, ls = (1LL << 60);
while(ls - li > 1) {
long long mid = (ls - ((ls - li) >> 1));
if(Check(mid))
li = mid;
else ls = mid;
}
fout << ls << '\n';
fin.close();
fout.close();
return 0;
}