Pagini recente » Cod sursa (job #254020) | Cod sursa (job #859127) | Cod sursa (job #2405209) | Cod sursa (job #2668508) | Cod sursa (job #914819)
Cod sursa(job #914819)
#include <fstream>
#include <vector>
#include <math.h>
#define MAXSOL 2305843009213693952
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
long long n,p,st=1,dr=MAXSOL,x,mij;
int nrdiv;
vector<long long> div;
vector<int> comb;
void divizori();
long long ireductibil(long long a);
bool nextcomb();
int main()
{
f>>n>>p;
divizori();
nrdiv=div.size()-1;
while(st<dr){
mij=(st+dr)/2;
x=ireductibil(mij);
if(x>=p)
dr=mij-1;
else
st=mij+1;}
while(ireductibil(st)<p)
st++;
g<<st<<'\n';
f.close();
g.close();
return 0;
}
void divizori(){
int i;
for(i=2;i<=sqrt((double)n);i++){
if(!(n%i)){
div.push_back(i);
while(!(n%i))
n/=i;}}
if(n>1)
div.push_back(n);}
long long ireductibil(long long a){
int i,j,semn=1;
long long sol,produs;
sol=a;
for(i=1;i<=nrdiv+1;i++){
semn*=(-1);
comb.clear();
for(j=0;j<i;j++)
comb.push_back(j);
do{
produs=1;
for(j=0;j<i;j++)
produs*=div[comb[j]];
sol+=(a/produs)*semn;}
while(nextcomb());}
return sol;}
bool nextcomb(){
int it=comb.size()-1;
while(it>=0&&comb[it]==nrdiv-comb.size()+1+it)
it--;
if(it<0)
return 0;
comb[it]++;
for(it=it+1;it<comb.size();it++)
comb[it]=comb[it-1]+1;
return 1;}