Cod sursa(job #509791)

Utilizator cosmyoPaunel Cosmin cosmyo Data 11 decembrie 2010 19:18:29
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
ll raspuns,produs = 1,x;
ll nr1; 
ll n, p, fct[30], nr;
void back (int k ) {
	int i;
	if(k > nr) {
		if( nr1 % 2 ==0)
			raspuns = raspuns + x / produs;
		else
			raspuns = raspuns - x / produs;
	}
	else
		for(i = 0; i <= 1; ++i) {
			
			if ( i == 1)
				++nr1, produs *= fct[k];
			back( k + 1);

			if( i == 1)
				--nr1, produs /= fct[k];
		}
}
ll rez(ll val) {
	raspuns = 0;
	x = val;
	produs = 1;
	nr1 = 0;
	back(1);
 return raspuns;
}
ll cauta(ll a, ll b) {
	ll m = (a + b) / 2, r = rez(m);
//	printf("%lld\n", r);
	if( r == p)
		return m;
	if( r > p)
		return cauta(a, m - 1);
	if ( r < p)
		return cauta(m + 1, b);
}
int main() {
	freopen("frac.in", "r", stdin);
	freopen("frac.out", "w", stdout);
	ll i, j, r;
	scanf("%lld %lld", &n, &p);
	r = sqrt(n);
		for( i = 2 ; i <= r; ++i)
			if(n % i == 0)
				fct[++nr] = i;
		--p;
	printf("%lld \n",cauta(1, ((ll)1 << 61) ) + 1 );

	return 0;
}