Pagini recente » Cod sursa (job #2920041) | Cod sursa (job #511722) | Cod sursa (job #218913) | Cod sursa (job #1122503) | Cod sursa (job #1357648)
/*
* Code by Spiromanul
*/
# include "fstream"
# include "cstring"
# include "vector"
# include "queue"
# include "bitset"
# include "algorithm"
# include "map"
# include "deque"
# include "iomanip"
# include "cmath"
const char IN [ ] = "frac.in" ;
const char OUT [ ] = "frac.out" ;
const int MAX = 154 ;
# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )
using namespace std;
ifstream cin ( IN ) ;
ofstream cout ( OUT ) ;
int fact [ MAX ] , np ;
long long submultimi ( long long NR )
{
int lim = 1 << np ;
long long ANS = 0 ;
FORN ( i , 1 , lim - 1 )
{
long long aux = 1 ; int nr = 0 ;
FORN ( j , 0 , np - 1 )
if ( i & ( 1 << j ) )
{
++ nr ;
aux = aux * fact [ j + 1 ] ;
}
if ( not ( nr & 1 ) )
aux = -aux ;
ANS = ANS + NR / nr ;
}
return ANS ;
}
long long caut_binar ( long long n , long long K )
{
long long st = 1 ;
long long dr = n ;
long long sol = - 1 ;
while ( st <= dr )
{
long long mij = ( st + dr ) >> 1 ;
if ( submultimi( mij ) >= K )
{
sol = mij ;
st = mij + 1 ;
}
else dr = mij - 1 ;
}
return sol ;
}
int main ( void )
{
long long n , K , cop ;
cin >> n >> K ;
cop = n ;
long long d = 2 ;
while ( d * d <= n )
{
int cate = 0 ;
while ( n % d == 0 )
{
n /= d ;
++ cate ;
}
if ( cate )
fact [ ++ np ] = d ;
}
if ( n > 1 )
fact [ ++ np ] = n ;
cout << 1 + caut_binar( cop , K ) << '\n' ;
return 0;
}