/* Googol (10^100)は非常に大きな数である: 1の後に0が100個続く. 100^100は想像を絶する. 1の後に0が200回続く. その大きさにも関わらず, 両者とも桁の和は1である. a, b < 100について自然数abを考える. 桁の和の最大を答えよ. */ #include <iostream> #include <sstream> #include <string> #include <climits> using namespace std; typedef unsigned long long I64; const int MAX = 1000000; string square(int x, int y) { int bigNum[34] = {0}; bigNum[0] = x; for (int k=1; k<y; ++k) { for (int i=0; i<34; ++i) { bigNum[i] *= x; } for (int i=0; i<33; ++i) { if (bigNum[i]>=MAX) { int d = bigNum[i] / MAX; bigNum[i] = bigNum[i] % MAX; bigNum[i+1] += d; } } } string os = ""; bool flat = false; for (int i=33; i>=0; --i) { string s; stringstream ss; ss << bigNum[i]; ss >> s; if (s.length()<6) { string zero(6-s.length(),'0'); s = zero + s; } os += s+","; } return os; } int string2int (string s) { int ret = 0; const char* chr = s.c_str(); while (*chr!='/0') { if (*chr!=',') ret += *chr - 48; chr++; } return ret; } int main() { int maxv = 0; for (int i=2; i<=100; ++i) { for (int j=2; j<=100; ++j) { string s = square(i, j); int tmp = string2int(s); if (maxv < tmp) maxv = tmp; } } cout << maxv << endl; }