Pagini recente » Cod sursa (job #1482439) | Cod sursa (job #1852022) | Cod sursa (job #760534) | Cod sursa (job #2905853) | Cod sursa (job #2957729)
#include<fstream>
#include<iostream>
#include<cstring>
#define DIM 1000
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
//ifstream f("in.in");
//ofstream g("out.out");
long long n,p;
long long d,k,v[DIM+5];
bool u[DIM+5];
long long nr,i,cnt,prod,j;
long long st,dr,mid,solNr;
bool sol(long long m){
//cout<<m<<" ";
memset(u,0,sizeof(u));
nr = 0;
while(u[0] == 0){
///generare
i = k;
while(u[i] == 1){
u[i] = 0;
i--;
}
if(i == 0){
break;
}
u[i] = 1;
cnt=0;prod=1;
for(j=1;j<=k;j++){
if(u[j] == 1){
prod*=v[j];
cnt++;
}
}
///includere/excludere
//cout<<"|"<<prod<<"|";
if(cnt != 0){
if(cnt%2 == 1){
nr+=m/prod;
}else{
nr-=m/prod;
}
}
}
m = m-nr;
//cout<<m<<"="<<nr<<" (";
if(m>=p){
//cout<<"1)\n";
return 1;
}
//cout<<"0)\n";
return 0;
}
int main(){
f>>n>>p;
d = 2;
while(d*d<=n && n!=1){
if(n%d == 0){
k++;
v[k] = d;
while(n%d == 0){
n/=d;
}
}
}
if(n!=1){
k++;
v[k] = n;
}
st=1;
dr=(1LL<<61);
solNr = -1;
while(st<=dr){
mid = (st+dr)/2;
//cout<<mid<<": ";
if(sol(mid) == 1){
solNr = mid;
dr = mid-1;
}else{
st = mid+1;
}
}
g<<solNr;
f.close();
g.close();
return 0;
}