题目:求已知k的n次方p和n,求k。
分析:模拟、二分。模拟大数乘法和比较,利用二分寻找k。如果n很大可利用快速幂。
注意:cstring和string.h中没有strrev函数、数据要用LL防止溢出。
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef long long LL;
LL p[ 205 ];
LL v[ 205 ];
char s[ 205 ];
void mul( int k, int n )
{
for ( int i = 0 ; i <= 200 ; ++ i )
v[i] = 0LL;
v[0] = 1LL;
for ( int i = 0 ; i < n ; ++ i ) {
for ( int j = 0 ; j <= 200 ; ++ j )
v[j] *= k;
for ( int j = 0 ; j <= 200 ; ++ j )
if ( v[j] > 9LL ) {
v[j+1] += v[j]/10LL;
v[j+0] %= 10LL;
}
}
}
LL cmp( LL *a, LL *b )
{
for ( int i = 200 ; i >= 0 ; -- i )
if ( a[i] != b[i] )
return a[i]-b[i];
return 0;
}
int bs( int n )
{
int l = 1,r = 1000000000;
while ( l < r ) {
int mid = l+(r-l+1)/2;//防止溢出
mul( mid, n );
int c = cmp( v, p );
if ( !c )
return mid;
if ( c > 0 )
r = mid-1;
else l = mid;
}
return l;
}
int main()
{
int n;
while ( cin >> n ) {
cin >> s;
for ( int i = 0 ; i <= 200 ; ++ i )
p[i] = 0LL;
int len = strlen(s);
for ( int i = 0 ; s[i] ; ++ i )
p[i] = s[len-1-i]-'0'+0LL;
cout << bs( n ) << endl;
}
return 0;
}