12/14 ABC384-D(14日目)
こんにちは、ゆーてぃーです。今回は「ゆーてぃーのAtCoder精進【14日目】」ということで、2024年12月14日に行われたABC384のD問題を解きたいと思います。
ゆーてぃーのAtCoder精進 Advent Calendar 2025
問題
D - Repeated Sequence
問題文
周期をもつ無限数列
の先頭
項
が与えられます。
この数列の空でない連続する部分列のうち、和がとなるものが存在するか判定してください。
ただし、無限数列が周期
をもつとは、
を満たすすべての整数
に対して
が成り立つことをいいます。
制約
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
の連続する部分列
であって、
となるものが存在するならば Yes を、そうでないならば No を出力せよ。
ゆーてぃーの解法
先頭項のまとまりで考えると、
先頭
項の総和
先頭
項の一部の総和となることがわかります。そしてその一部は必ず先頭
項のうち連続している部分の和となるので、
先頭
項の総和 の値が連続している部分の和かどうか判断すれば求められます。先頭
項の累積和をとることで先頭
項の部分和を計算することができます。ただし、数列
のうちの
の部分が答えになっているとまとまり以外の連続している部分は
となります。これは先頭
項の一番右の
から連続した3つを取らないといけません。なので先頭
項を2つ並べて累積和とることで実現できます。右(2つ目の先頭
項)にずれていくごとに探索範囲外となった
を引いていけば先頭
項の
から
番目の総和も求められます。
あとはこの累積和に対して二分探索を行い、先頭
項の総和 があればYes、なければNoを出力すればおっけーです。
と制約が大きいのでunsigned long longを使いました。
感想など
累積和、二分探索など今まで学んだ内容の総復習のような問題でした。何回も修正を加えて最終的にはACできたのでとても楽しかったです。