Cod sursa(job #1357648)

Utilizator xtreme77Patrick Sava xtreme77 Data 24 februarie 2015 00:51:37
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
/*
 * 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;
}