Pagini recente » Cod sursa (job #91250) | Cod sursa (job #2037415) | Cod sursa (job #2477374) | Cod sursa (job #3246704) | Cod sursa (job #3291962)
#include<bits/stdc++.h>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
int nr_div,nr_elemente;
long long suma,fact,divizor[30],n,p,mij;
bool eratostene[200001];
long long prim[200001],ct;
void back(int k,int nr,long long produs)
{if(nr_div-k<nr_elemente-nr)return ;
for(int i=k;i<=nr_div;i++)
{if(nr==nr_elemente)
suma+=fact*mij/(produs*divizor[i]);
else
back(i+1,nr+1,produs*divizor[i]);}}
int main()
{for(int i=2;i<=200000;i++)
if(!eratostene[i])
{prim[++ct]=i;
for(int j=2*i;j<=200000;j+=i)
eratostene[j]=1;}
in>>n>>p;
long long st=1,dr=4e18;
for(int i=1;prim[i]*prim[i]<=n;i++)
if(!(n%prim[i]))
{divizor[++nr_div]=prim[i];
while(!(n%prim[i]))n/=prim[i];
}
if(n>1)divizor[++nr_div]=n;
while(st<=dr)
{mij=(st+dr)/2;
suma=0;
for(int i=1;i<=nr_div;i++)
{nr_elemente=i;
if(i%2)fact=1;
else
fact=-1;
back(1,1,1);}
long long rezultat=mij-suma;
//out<<suma<<endl;
if(rezultat==p)
{out<<mij;
st=dr+1;
}
else
{if(rezultat>p)
dr=mij-1;
else
st=mij+1;
}
}
//out<<endl;
//for(int i=1;i<=nr_div;i++)out<<divizor[i]<<" ";
}