Cod sursa(job #763619)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 2 iulie 2012 18:24:19
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<fstream>

using namespace std;


ifstream f("frac.in");
ofstream g("frac.out");
long long v[20],x[20],X,n,i,SOL,p,res,k;
void afis(long long A){
	
	long long  sol=1;
	long long nr=0;
	for(long long  i=1;i<=k;i++)
		if(x[i]==1){
			++nr;
			sol*=v[i];
		}
	
	if(nr){
		if(nr%2)
			SOL+=A/sol;
		else
			SOL-=A/sol;
		
	}
	
}
void back(long long niv,long long A){
	
	if(niv==k+1){
		afis(A);
		return ;
	}
	for(int i=0;i<=1;++i){
		x[niv]=i;
		back(niv+1,A);
	}
}
int check(long long  A){
	SOL=0;
	back(1,A);
	return A-SOL;
}
int cb (long long st,long long dr){
	long long r,mid,pos;
	pos=dr+1;
	while(st<=dr){	
		mid=(st+dr)/2;
		 r=check(mid);
		
		if(r>=p){
			dr=mid-1;
			pos=mid;
		}
		else
			st=mid+1;
	}
	return pos;
}
int main () {
	
	f>>n>>p;
	
	
	X=n;
	
	for(i=2; i*i<=X ; ++i) {
		if(X%i==0){
			X/=i;
			while(X%i==0)
				X/=i;
			v[++k]=i;
		}
		
	}
	if(X!=1)
		v[++k]=X;
	long long h=1<<31;
	res=cb(1,h);
	g<<res<<"\n";
	return 0;
}