Pagini recente » Cod sursa (job #2946418) | Cod sursa (job #467960) | Cod sursa (job #1293404) | Cod sursa (job #2540838) | Cod sursa (job #2582433)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <assert.h>
const int MAXN = 1e6 + 5;
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
typedef long long ll;
bool ciur[MAXN];
ll prime[MAXN];
int index;
vector<ll>divs;
ll pozitie,n;
void construieste_ciur(){
prime[++index] = 2;
for(ll i = 3; i <= MAXN - 1; i += 2){
if(!ciur[i]){
prime[++index] = i;
for(ll j = i * i; j <= MAXN - 1; j += i){
if(j < 0)
break;
ciur[j] = true;
}
}
}
}
void construieste_divizori(ll n){
ll d = 2;
int index = 1,exp;
while(d * d <= n){
assert(d > 0);
exp = 0;
while(n % d == 0){
n /= d;
exp++;
}
if(exp)
divs.emplace_back(d);
index++;
d = prime[index];
}
if(n > 1)
divs.emplace_back(n);
}
bool ok(ll numar){
int maxim = divs.size();
ll ans = 0;
for(int i = 1; i < (1<<maxim); ++i){
ll prod = 1;
int cnt = 0;
for(int j = 0; j < maxim; ++j){
if((i & (1<<j)) > 0){
prod *= divs[j];
cnt++;
}
}
assert(prod > 0);
if(cnt & 1)
ans += numar / prod;
else
ans -= numar / prod;
}
assert(numar > 0);
if(numar - ans < pozitie)
return true;
if(numar - ans == pozitie && __gcd(numar,n) == 1)
return true;
return false;
}
ll cautbinar(){
ll pas = 1ll<<61, r = 0;
while(pas){
if(ok(r + pas))
r += pas;
pas /= 2;
}
return r;
}
int main()
{
in>>n>>pozitie;
construieste_ciur();
construieste_divizori(n);
out<<cautbinar();
return 0;
}