Pagini recente » Cod sursa (job #2233294) | Cod sursa (job #1153386) | Cod sursa (job #2212118) | Cod sursa (job #1622151) | Cod sursa (job #509802)
Cod sursa(job #509802)
#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(a >= b)
return a - 1;
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);
for( i = 2 ; i * i <= n; ++i) {
if(n % i == 0 )
fct[++nr] = i;
while( n % i == 0)
n/=i;
}
if( n > 1)
fct[++nr] = n;
--p;
printf("%lld \n",cauta(1, ((ll)1 << 61) ) + 1 );
return 0;
}