Pagini recente » Cod sursa (job #804995) | Cod sursa (job #3179478) | Rating Goicea Sorin Gabriel (bluesistemgaby) | Cod sursa (job #713906) | Cod sursa (job #1020584)
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
int n,k,P;
int nrprim[110011];
int prim[110011];
bool viz[113311];
long long sol,mid;
void ciur(){
for(register int i=2;i<113311;i++){
if(!viz[i]){
nrprim[++nrprim[0]]=i;
for(register int j=i+i;j<=113311;j+=i)
viz[j]=true;
}
}
}
void track(int poz,long long prod,int nr){
if(poz>k){
sol+=(nr%2==0?1:-1)*(mid/prod);
return;
}
track(poz+1,prod,nr);
nr++;
prod*=prim[poz];
track(poz+1,prod,nr);
prod/=prim[poz];
nr--;
}
inline int ver(){
sol=0;
track(1,1,0);
if(sol==P-1)
return 0;
else
return sol-P+1;
}
int main(void){
register int i,j,p,u,val;
ciur();
f>>n>>P;
i=1,val=sqrt(n),u=n;
while(u!=1 && nrprim[i]<val){
if(u%nrprim[i]==0){
prim[++k]=nrprim[i];
while(u%prim[k]==0)
u/=prim[k];
}
i++;
}
if(u!=1)
prim[++k]=u;
p=1,u=2305843009213693952;
int ok;
while(p<=u){
mid=p+(u-p)/2;
ok=ver();
if(ok==0){
//am gasit solutia
break;
}
else{
if(ok<0)
p=mid+1;
else
u=mid-1;
}
}
g<<mid;
f.close();
g.close();
return 0;
}