Pagini recente » Cod sursa (job #2092696) | Cod sursa (job #1032311) | Cod sursa (job #2845795) | Cod sursa (job #607277) | Cod sursa (job #1970288)
///cautam binar rezultatul
///aplicand algoritmul de la problema pinex
#include <fstream>
using namespace std;
ifstream cin("frac.in");
ofstream cout("frac.out");
long long n,k,i,j,m,st,dr,mj,solution,nrdiv,divi[50];
long long p[50000];
bool ciur[110000];
void descompune()
{
for(i=1;p[i]*p[i]<=n&&i<=m;i++)
{
if(n%p[i]==0)
{
while(n%p[i]==0)
n/=p[i];
divi[++nrdiv]=p[i];
}
}
if(n>1)
divi[++nrdiv]=n;
}
long long pinex(long long a,long long b)
{
long long i,j,prod,sol=a,nr;
for(i=1;i<(1<<nrdiv);i++)
{
nr=0;
prod=1;
for(j=0;j<nrdiv;j++)
{
if((1<<j)&i)
{
nr++;
prod*=1LL*divi[j+1];
}
}
if(nr%2)
nr=-1;
else
nr=1;
sol+=1LL*nr*a/prod;
}
return sol;
}
void cautare_binara()
{
st=1;
dr=(1LL<<61);
while(st<=dr)
{
mj=(st+dr)/2;
if(pinex(mj,n)==k)
{
solution=mj;
dr=mj-1;
}
if(pinex(mj,n)<k)
st=mj+1;
else
dr=mj-1;
}
}
void genereaza()
{
for(i=2;i<=109545;i++)
if(ciur[i]==0)
{
p[++m]=i;
for(j=i*i;j<=109545;j+=i)
ciur[j]=1;
}
}
int main()
{
cin>>n>>k;
genereaza();
descompune();
cautare_binara();
cout<<solution;
return 0;
}