#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;
typedef long long llint;

const llint base = 100000000LL;

char buff[ 30005 ]; int n;

struct bignum {
       vector< llint > p;
       
       bignum() { p.clear(); }
       bignum( int x ) { p.clear(); p.push_back( x ); }
       
       void read() {
            n = strlen( buff );
            for( int i = n-1; i >= 0; i -= 8 ) {
                 llint cur = 0;
                 for( int j = max( 0, i-7 ); j <= i; ++j )
                      cur = cur*10LL + buff[j]-'0';
                 p.push_back( cur );
            }
       }
       
       void print() {
            printf( "%I64lld", p[p.size()-1] );
            for( int i = p.size()-2; i >= 0; --i )
                 printf( "%08I64lld", p[i] );
            putchar( '\n' );
       }
       
       void trim() {
            for( int i = 0; i < p.size(); ++i ) {
                 llint go = p[i]/base;
                 if( go && i+1 == p.size()-1 ) p.push_back( 0 );
                 p[i+1] += go;
                 p[i] %= base;
            }
            while( p[p.size()-1] == 0 ) p.pop_back();
            if( p.size() == 0 ) p.push_back( 0 );
       }
       
       
};


inline bignum div2( bignum a ) {
       llint mod = 0;
       
       for( int i = a.p.size()-1; i >= 0; --i ) {
            mod = mod*base+a.p[i];
            a.p[i] = ( mod >> 1 );
            mod = ( mod&1 );
       }
       
       a.trim();
       return a;
}

inline bignum mult( bignum a, bignum b ) {
       bignum c; c.p.resize( a.p.size()+b.p.size(), 0 );
       for( int i = 0; i < a.p.size(); ++i )
            for( int j = 0; j < b.p.size(); ++j )
                 c.p[i+j] += a.p[i]*b.p[j];
       c.trim();
       return c;
}

inline bignum add( bignum a, bignum b ) {
       if( a.p.size() < b.p.size() ) swap( a, b );
       //printf( "ap: " ); a.print();
       //printf( "bp: " ); b.print();
       for( int i = 0; i < b.p.size(); ++i ) {
            a.p[i] += b.p[i];
            //printf( "%I64lld : %I64lld %I64lld\n", a.p[i], b.p[i] );
       }
       
       //printf( "adp: " ); a.print();
       a.trim();
       return a;
}

inline bignum power( bignum a, llint p ) {
       bignum bip = a, ret = bignum( 1 );
       for( int i = 0; ( 1 << i ) <= p; ++i ) {
            if( ( p & ( 1 << i ) ) != 0 ) ret = mult( ret, bip );
            bip = mult( bip, bip );
       }
       return ret;
}

inline bool lt( bignum a, bignum b ) {
     if( a.p.size() != b.p.size() ) return ( a.p.size() < b.p.size() );
     for( int i = a.p.size()-1; i >= 0; --i ) 
          if( a.p[i] != b.p[i] ) return ( a.p[i] < b.p[i] );
     return  0;
}

bignum X, lo, hi, mid;
int p;

int main( void )
{
    /*
    bignum b, a;
    //a.read();
    b.read();
    
    printf( "%d\n", lt( a, b ) );
    //printf( "gotov read\n" );
    */
    /*
    div2( b ).print();
    bignum k = mult( div2( b ), bignum( 2 ) );
    k.print();
    */
    
    scanf( "%s", buff );
    X.read();
    //buff[ (n/2) + 3 ] = 0;
    hi.read();
    scanf( "%d", &p );
    
    lo = bignum( 0 );
    //hi = X;
    int c = 0;
    while( lt( lo, hi ) ) {
           //printf( "ide\n" );
           //printf( "lo " ); lo.print();
           //printf( "hi " ); hi.print();
           mid = div2( add( lo, hi ) );
           //printf( "add: " ); add( lo, hi ).print();
           //printf( "mid: " ); mid.print();
           if( lt( power( mid, p ), X ) ) lo = add( mid, bignum(1) );
           else hi = mid;
    }
    
    lo.print();
    
    scanf( "\n" );
    return 0;
}
