Cod sursa(job #211703)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 3 octombrie 2008 13:55:03
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>
#include <math.h>
#define N 15
long long n,p,prim[N];
void precalc(){
	long long rad,i,cop;
	int c;
	//for(i=0;i<=N;i++)
	//	prim[i]=1;
	rad=(long long)sqrt(n);cop=n;
	for(i=2;i*i<=cop;i++){
		for(c=0;cop%i==0;cop/=i,c++);
		if(c) prim[++prim[0]]=i;
	}
	if(cop) prim[++prim[0]]=cop;
	for(i=prim[0]+1;i<=N;i++)
		prim[i]=1;
}
void calcul(int x, int &nrbiti,long long &prod){
	nrbiti=0;prod=1;
	int c=0;
	while(x){
		c++;
		if(x&1) {
			nrbiti++;
			prod*=prim[c];
		}
		x/=2;
	}
}
long long f(long long x){
	int nrbiti=0;
	long long s=x,prod=1;
	for(int i=1;i<(1<<prim[0]);i++){
		
		calcul(i,nrbiti,prod);
		if(nrbiti&1) 
			s-=x/prod;
		else s+=x/prod;
	}
	return s;
}
int main(){
	long long st=1,dr=1LL<<61-1,m;
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	scanf("%lld%lld",&n,&p);
	precalc();
	while(st<dr){
		m=(st+dr)>>1;
		if(f(m)>=p) dr=m;
		else st=m+1;
	}
	printf("%lld\n",st);	
	return 0;
}