AtCoder Beginner Contest 254 F問題 Rectangle GCD
問題
提出解答
問題の概要
長さが の整数列 と2重添字数列 がある. ここで, である.
次の 個の質問に答えよ.
- における全ての の最大公約数求めよ.
制約
解法
に対する最大公約数を と書くことにする. このとき, 次が成り立つ.
を整数とするとき, 以下が成り立つ.
そして, 次のことも成り立つ. この性質がこの問題の本質である.
整数 に対して,
同様に, なので, となる整数 が存在するが, より, はともに の倍数なので, である. 以上から, かつ なので, である.
証明
この性質を利用すると, 次のことが示せる.
とする. 整数 に対して,
となる.
証明
これらの性質から, 各質問に対して, 最大公約数を以下のようにして求めることができる. ただし, とする. また, 以降では の最大公約数を と書くことにする.
は から合計 時間で計算できる. また, については 上では を演算, を単位元とする (可換) モノイドをなすので, Segment Tree を用いて計算できる. 計算量については,
- Segment Tree の構成に 時間.
- 各クエリに 時間.
よって, 合計 時間で処理できる.
なお, 今回の問題では は が与えられた時点で確定し, 変更しないので, Segment Tree の代わりに, Disjoint Sparse Table を用いてもよい. このとき, 計算量は
- Disjoint Sparse Table の構成に 時間.
- 各クエリに 時間.
であり, この場合は全体で 時間になる.
謝辞
最初, 長さ の整数列 における の時間計算量を としていたが, 31536000 さん (31536000 (@CuriousFairy315) | Twitter) の指摘と解説 により, 訂正しました. ここに感謝の意を表す. atcoder.jp