C++の練習を兼ねて, AtCoder Regular Contest 026 の 問題A (A – ダイナミックなポーズ) ~ 問題B (B – 完全数) を解いてみた.
■感想.
1. 問題B で, 約数の計算方法を復習できたので良かったと思う.
2. 時間を見つけて, 引き続き, 過去問を振り返っていきたいと思う.
本家のサイトARC 026 解説をご覧下さい.
■C++版プログラム(問題A/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <bits/stdc++.h> using namespace std; int main(){ // 1. 入力情報. int N, A, B; scanf("%d %d %d", &N, &A, &B); // 2. 出力. printf("%d\n", A * max(N - 5, 0) + B * min(N, 5)); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[入力例] 10 5 1 [出力例] 30 ※AtCoderのテストケースより [入力例] 4 60 7 [出力例] 28 ※AtCoderのテストケースより |
■C++版プログラム(問題B/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 36 37 38 39 40 41 42 43 44 45 46 |
#include <bits/stdc++.h> using namespace std; using LL = long long; #define pb push_back // 与えられた正の整数のすべての約数を抽出. // @param X: 約数を抽出したい正の整数. // @return ret: すべての約数. vector<LL> div(LL X){ vector<LL> ret; ret.pb(1); for(LL d = 2; d * d <= X; d++){ if(X % d == 0){ ret.pb(d); if(d * d != X) ret.pb(X / d); } } // subtask1_24.txt で WA版. // ret.pb(X); if(X > 1) ret.pb(X); return ret; } int main(){ // 1. 入力情報. LL N; scanf("%lld", &N); // 2. 約数を計算. vector<LL> v = div(N); // 3. 約数の和を計算. LL sum = -N; for(auto &p : v) sum += p; // 4. 完全数か? string ans = "Perfect"; if(sum > N) ans = "Abundant"; if(sum < N) ans = "Deficient"; // 5. 出力. printf("%s\n", ans.c_str()); 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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
[入力例] 6 [出力例] Perfect ※AtCoderのテストケースより [入力例] 24 [出力例] Abundant ※AtCoderのテストケースより [入力例] 27 [出力例] Deficient ※AtCoderのテストケースより [入力例] 945 [出力例] Abundant ※AtCoderのテストケースより [入力例] 1 [出力例] Deficient [入力例] 8128 [出力例] Perfect [入力例] 33550336 [出力例] Perfect [入力例] 8589869056 [出力例] Perfect [入力例] 10000000000 [出力例] Abundant |
■参照サイト
AtCoder Regular Contest 026
完全数