题目分析:裸高精度。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std ; #define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i ) #define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i ) #define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i ) #define clr( a , x ) memset ( a , x , sizeof a ) typedef long long LL ; const LL L = 1000000000 ;//1e9 const int N = 120 ; const int MAXN = 1005 ; struct BigInt {//only support positive number int digit[N] ; int length ; BigInt () : length ( 0 ) { clr ( digit , 0 ) ; } BigInt ( LL number ) : length ( 0 ) { clr ( digit , 0 ) ; while ( number ) { digit[length ++] = number % L ; number /= L ; } } BigInt operator = ( LL number ) { length = 0 ; clr ( digit , 0 ) ; while ( number ) { digit[length ++] = number % L ; number /= L ; } return *this ; } BigInt operator = ( const char buf[] ) { int len = strlen ( buf ) ; length = ( len - 1 ) / 9 + 1 ; clr ( digit , 0 ) ; rep ( i , 0 , len ) { int index = ( len - i - 1 ) / 9 ; digit[index] = digit[index] * 10 + buf[i] - '0' ; } return *this ; } BigInt maintain () { while ( length && digit[length - 1] == 0 ) -- length ; return *this ; } int operator [] ( const int index ) const { return digit[index] ; } int& operator [] ( const int index ) { return digit[index] ; } BigInt operator + ( const BigInt& b ) const { BigInt c ; c.length = max ( length , b.length ) + 1 ; LL addv = 0 ; rep ( i , 0 , c.length ) { addv += digit[i] + b[i] ; c[i] = addv % L ; addv /= L ; } return c.maintain () ; } BigInt operator - ( const BigInt& b ) const { BigInt c ; c.length = length ; LL delv = 0 ; rep ( i , 0 , length ) { delv += digit[i] - b[i] ; c[i] = delv ; delv = 0 ; if ( c[i] < 0 ) { LL tmp = ( -c[i] - 1 ) / L + 1 ; c[i] += tmp * L ; delv = -tmp ; } } return c.maintain () ; } BigInt operator * ( const BigInt& b ) const { BigInt c ; c.length = length + b.length ; rep ( i , 0 , length ) { LL mulv = 0 ; For ( j , 0 , b.length ) { mulv += ( LL ) digit[i] * b[j] + c[i + j] ; c[i + j] = mulv % L ; mulv /= L ; } } return c.maintain () ; } BigInt operator / ( const LL b ) const { BigInt c ; c.length = length ; LL divv = 0 ; rev ( i , length - 1 , 0 ) { divv = divv * L + digit[i] ; c[i] = divv / b ; divv %= b ; } return c.maintain () ; } bool operator < ( const BigInt& b ) const { if ( length != b.length ) return length < b.length ; rev ( i , length - 1 , 0 ) if ( digit[i] != b[i] ) return digit[i] < b[i] ; return 0 ; } bool operator > ( const BigInt& b ) const { return b < *this ; } bool operator <= ( const BigInt& b ) const { return !( b < *this ) ; } bool operator >= ( const BigInt& b ) const { return !( *this < b ) ; } bool operator == ( const BigInt& b ) const { return !( b < *this ) && !( *this < b ) ; } bool operator != ( const BigInt& b ) const { return b < *this || *this < b ; } BigInt operator += ( const BigInt& b ) { return *this = ( *this ) + b ; } BigInt operator -= ( const BigInt& b ) { return *this = ( *this ) - b ; } BigInt operator *= ( const BigInt& b ) { return *this = ( *this ) * b ; } BigInt operator /= ( const LL b ) { return *this = ( *this ) / b ; } void show () { if ( length == 0 ) printf ( "0" ) ; else { printf ( "%d" , digit[length - 1] ) ; rev ( i , length - 2 , 0 ) printf ( "%09d" , digit[i] ) ; } printf ( "\n" ) ; } } ; int a , b ; void solve () { BigInt ans1 = 1 , ans2 = 1 ; For ( i , 1 , b ) ans1 *= a ; For ( i , 1 , a ) ans2 *= b ; //ans1.show () ; //ans2.show () ; BigInt ans ; if ( ans1 >= ans2 ) { ans = ans1 - ans2 ; ans.show () ; } else { ans = ans2 - ans1 ; printf ( "-" ) ; ans.show () ; } } int main () { while ( ~scanf ( "%d%d" , &a , &b ) ) solve () ; return 0 ; }
代码如下: