0.はじめに
2026年最初のコンテストとに臨む今日この頃。
ABのあと、Cでブレーキ。どうしても解けないのでDを見たところ
意外と行けそうだったんでそちらに取り掛かったところ何とか正解。
Cは結局解けず時間切れとなりました。
3問正解だったのでちょっとだけレートは上がり、+4の748と微増で
2026年のスタートを切りました。
1. A - 2^n - 2*n
小手調べ的な問題。
Nを入力して指示通り計算し出力してACとなりました。
https://atcoder.jp/contests/abc439/submissions/72167124
2.B - Happy Number
急に難し気な問題。ハッピー数を求める計算を用意し
インプットしたNから計算を繰り返していく考えでよいとは思いましたが
ポイントとしてはどのタイミングでくりかえしをストップするかという点でした。
結局セットを用意して、ハッピー数を計算した数字をとっておき
前に計算した数字だったら終了としました。
【実装】
1.Nを入力
2.セットYを初期化
3.YにNが含まれない間以下を実行
-1.Nを文字列化し、1文字ずつリストSにセット
-2.変数now(ループ内のNからハッピー数を求めるための変数)を0で初期化
-3.Sを1文字ずつ読み込み、int化したのち2乗しnowに加算
-4.nowが1の時Yesを出力して終了
-5.YにNを追加
-6.Nをnowで置き換え
4.ループを抜けたらNoを出力して終了
https://atcoder.jp/contests/abc439/submissions/72179059
3.C - 2026
何を血迷ったか最初に平方数を列挙して組み合わせて作れる数字を
列挙して・・・と、TLEな上にWAまで出る状況だったのでスルー。
コンテスト後解説をみて解けました。(解答丸写しですが。)
【実装】
1.Nを入力
2.リストC(N+1個の値を持つ)を0で初期化。
(1~Nまでの数字が、x2乗+Y2乗の式で作成できる個数を保持)
3.変数xを1で初期化
4.以下、xの2乗がN以下の間繰り返し
-1.yにx+1をセット
-2.以下、xの2乗+yの2乗がN以下の間繰り返し
-1.C[xの2乗+yの2乗]に1を加算
-2.yに1加算
-3.xに1加算
5.回答用リストansを空で初期化
6.以下iを1からNまで繰り返し
-1.C[i]が1の時ansにiを追加
7.ansの個数と内容を出力して終了
元のも同じくらいの計算量な気がしてましたが全然違いました・・・。
https://atcoder.jp/contests/abc439/submissions/72220986
4.D - Kadomatsu Subsequence
さっとみて行けそうかと思い取り掛かりました。
【考え方】
1.リストの値が3、5、7で割り切れる時
割る値それぞれの辞書を用意し割った値をキー、リストでの位置を値(リスト化)にセット
2.5で割り切れた値の辞書からキーと値のリストを取り出し
値のリストそれぞれについて、3、7ぞれぞれの辞書の同じキーのリストから
5の辞書の位置から前にある、3の辞書の値の個数×7の辞書の値の個数と
5の辞書の位置から後ろにある、3の辞書の値の個数×7の辞書の値の個数を
合計していき最後にその値を出力
→5で割り切れる値の前にあるか後ろにあるかの条件が共通していれば
jがminかmaxにある状態と言える
defaultdictやbisectを駆使してなんとかACをもらえました。
https://atcoder.jp/contests/abc439/submissions/72213991
以上