Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese
うーん, これは…
解法
結局 log を一回取るだけで良かったようです。ナニコレ
一応学んだこととしては, long double が扱える範囲が結構大きいことですね。
@mayoko_ 64bitの小数が10^308位じゃなかったですかね。80bitの小数型は指数分に2^16384程度の値が取れるのでもっと大きいはず。
— kmjp (@kmjp_pc) 2016, 2月 1
調べてみたら(numeric_limits
typedef long double Real; string ans[12]; Real eps = 1e-7; int main() { cin.tie(0); ios::sync_with_stdio(false); ans[0] = "x^y^z", ans[1] = "x^z^y", ans[2] = "(x^y)^z", ans[3] = "(x^z)^y"; ans[4] = "y^x^z", ans[5] = "y^z^x", ans[6] = "(y^x)^z", ans[7] = "(y^z)^x"; ans[8] = "z^x^y", ans[9] = "z^y^x", ans[10] = "(z^x)^y", ans[11] = "(z^y)^x"; Real x, y, z; cin >> x >> y >> z; vector<Real> num(12); num[0] = powl(y, z)*log(x); num[1] = powl(z, y)*log(x); num[2] = y*z*log(x); num[4] = powl(x, z)*log(y); num[5] = powl(z, x)*log(y); num[6] = x*z*log(y); num[8] = powl(x, y)*log(z); num[9] = powl(y, x)*log(z); num[10] = x*y*log(z); int index = 0; for (int i = 1; i < 12; i++) { if (i%4==3) continue; if (num[index] < num[i]) index = i; } cout << ans[index] << endl; return 0; }