Cod sursa(job #3380)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 24 decembrie 2006 11:29:50
Problema Frac Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#include<math.h>
#define fin "frac.in"
#define fout "frac.out"
#define NMAX 1000000000L
long long n,p,m,tmp,desc[100],st=1,dr=NMAX;
int x[100];
FILE *in,*out;

void desc_f(long long a) {
long long i,lim;
	
	lim=(long long)sqrt(a);

	i=2;

	while (a!=1 && i<=lim) {
		
		if (a%i==0) { 

			while (a%i==0) a/=i;

			desc[++desc[0]]=i;

			++i;
		}

		else ++i;
	}	
	
	if (a!=1) desc[++desc[0]]=a;
}

long long go(int i,long long a) {
int val,j;
long long aux;
	for (val=x[i-1]+1;val<=desc[0];++val) {

		x[i]=val;
		aux=1;
		for (j=1;j<=i;++j) aux*=desc[x[j]];
			
		if (i%2) tmp=tmp+(a/aux); 
		
		else tmp=tmp-(a/aux);

		go(i+1,a);
	}


}

void search() {
long long nr1,nr2;

	m=(st+dr)/2;
	
	tmp=0; go(1,m);   nr1=m-tmp; 
	tmp=0; go(1,m-1); nr2=(m-1)-tmp;
	
	//printf("%lld: %lld\n",m,nr1);
	if (nr1==p && nr2<p) return ;

	else { 
		if (p<=nr1) { 
			
			dr=m-1;
			search();
		}
		else {
			st=m+1;
			search();
		}
	}		
}

int main() {
long long i,k=1;
	
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%lld%lld",&n,&p);

	desc_f(n);

	search();
	
	fprintf(out,"%lld\n",m);
	
	fclose(in); fclose(out);

	return 0;
}