Pagini recente » Cod sursa (job #1842892) | Cod sursa (job #2486498) | Cod sursa (job #970527) | Cod sursa (job #125578) | Cod sursa (job #1025386)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
#define ll long long
#define MaxDiv 100
#define mid ((li+ls)/2)
ll N,P,nrDiv,globalSum;
int Div[MaxDiv];
void descompunere(ll N)
{
ll a = N;
for(ll i=2;i*i <= a && N > 1;i++)
if(N%i == 0)
{
Div[++nrDiv] = i;
for(;N%i == 0;N/=i);
}
if(N > 1)
Div[++nrDiv] = N;
}
inline void back(int k,int P,int last,ll S,ll prod,ll val)
{
if(k == P+1)
{
globalSum += prod*(val/S);
return ;
}
for(int i=last+1;i<=nrDiv;i++)
back(k+1,P,i,S*Div[i],prod,val);
}
inline ll pinex(ll val)
{
globalSum = 0;
for(int i=1;i<=N;i++)
back(1,i,0,1LL,(i&1) ? 1LL : -1LL,val);
return globalSum;
}
inline ll cautBin(ll li,ll ls)
{
if(li > ls)
return li;
//cout << li << " " << ls << "\n";
ll numar = mid-pinex(mid);
//cout << mid << " " << numar << "\n";
if(numar >= P)
return cautBin(li,mid-1);
else
return cautBin(mid+1,ls);
}
int main()
{
f >> N >> P;
descompunere(N);
//g << cautBin(2LL,(1LL<<61)-10LL);
}