Cod sursa(job #194062)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 8 iunie 2008 11:16:35
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#define N 1000000
unsigned long long n,P,sol,prod,n2,e;
unsigned long long p[N], v[N];
void back(unsigned long long prod, unsigned long long count, unsigned long long where, unsigned long long pos, unsigned long long x){
	unsigned long long i;
	if(count>0){
		if(count%2)
			e+=x-x/prod;
		else
			e-=x-x/prod;   
    }
	for(i=pos;i<=p[0];++i){
		v[where]=p[i];
		back(prod*p[i],count+1,where+1,i+1,x);
		v[where]=0;
	}
}
unsigned long long nr(unsigned long long x){
	e=0;
	back(1,0,1,1,x);
	return e;   
}
void solve(){
	unsigned long long i,x,l,r,m;
	for(n2=n,i=2;n2>1;++i)
		for(;n2%i==0;n2/=i)
			if(i!=p[p[0]])
				p[++p[0]]=i;
	for(x=2;nr(x)<P;x<<=1);
	for(l=1,r=x;l<=r;){
		m=(l+r)>>1;
		x=nr(m);
		if(x>=P){
			r=m-1;
			sol=m;
		}
		else{
			l=m+1;
		}
	}
}
int main(){
	freopen("frac.in","r",stdin);
	freopen("frac.out","w",stdout);
	scanf("%llu%llu",&n,&P);
	solve();
	printf("%llu\n",sol);
	return 0;
}