C++の練習を兼ねて, AtCoder Beginner Contest 166 の 問題D (D – I hate Factorization) を解いてみた.
■感想.
1. A, B について, 確認する必要のある範囲を絞り込めたので, 何とかAC版となった.
2. 時間を見つけて, 引き続き, 過去問を振り返っていきたいと思う.
本家のサイトABC 166 解説をご覧下さい.
■C++版プログラム(問題D/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <bits/stdc++.h> using namespace std; using LL = long long; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) int main(){ // 1. 入力情報. LL X; scanf("%lld", &X); // 2. A, B を 求める. // 上限は, 1019663401 = 120 * 120 * 120 * 120 * 120 - 119 * 119 * 119 * 119 * 119 int A = 0, B = 0; repx(i, -120, 121){ repx(j, -120, 121){ LL a = (LL)j; LL b = (LL)i; if(a * a * a * a * a - b * b * b * b * b == X){ A = j; B = i; break; } } } // 3. 出力. assert(!(A == 0 && B == 0)); printf("%d %d\n", A, B); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
[入力例] 33 [出力例] 2 -1 ※AtCoderテストケースより [入力例] 1 [出力例] 0 -1 ※AtCoderテストケースより ※上記のプログラムだと以下のように出力される. 1 0 [入力例] 464148982 [出力例] 55 33 [入力例] 2705364300 [出力例] 77 17 [入力例] 373767689 [出力例] 52 23 |
■参照サイト
AtCoder Beginner Contest 166