初めて解説記事を書くので至らぬ点もあると思いますが、よろしくお願いします。
では、行きましょう。
問題概要
個のクエリで整数が与えられる。以下の以下のからなるペアのうち、ユークリッドの互除法の反復回数が最多となるものを求め、またその回数となるようなペアの数を出力せよ。
ステップ1 反復回数の最大値
まず、とを逆にしても結果は変わらないので、以降はとなるようにされているとします。
反復回数が回となるようなペアを列挙して(ただし、ペアのつめの要素がつめの要素より小さいとします)した時に一番先頭に来るペアが、反復回数が回となるペアの中でつめの要素が最小(した時点でこれは満たされる)かつつめの要素が最小だとします。
この時、反復回数が回となるようなペアの中で一番小さいペアをとすると、反復回数が回となるようなペアの中で一番小さいペアはです。
このような性質があれば反復回数の最大値を求められるのが楽そうです。
ではこの性質が満たされるはあるのでしょうか。実は最小でのときが満たし、これよりのときこの性質が満たされることが分かります。
反復回数が回となるようなペアの中で一番小さいペアはです。(ペアの小さい方の数字がなら反復回数はで、ならになるためです。出力例の説明からでもこの事実は導けると思います。)
よって、反復回数が回のペアのうち最小のものは、回のペアのうち最小のものは...とフィボナッチ数列的に求められます。後は各クエリごとに反復回数が回のペアを作れるか調べればよいです。(二分探索でもよいですが、フィボナッチ数列の第項はを軽く超えるので全探索でも十分間に合います)
また、反復回数の最大値がとなるようなクエリの判定はが未満またはが未満のどちらかが満たしているかをチェックすればよいです。
ステップ2 反復回数の最大値をとるペアの数
反復回数の最大値をとします。
まずの時、0が含まれていなければ必ず反復回数はになるので、答えはです。
以降はの場合を考えます。
反復回数が回となるようなペアをあらかじめ全て列挙して、それを作ることができるかを判定すればよいですが、...の反復回数は全て回であり、これは難しいです。しかし、は全て反復回数が回であることを利用すると、を満たすの最大値を求め、これをペアの数に足し合わせばよいです。
これを利用すると、反復回数が回となるようなペアを全て列挙するときに、そのペアをとしたときに、が満たされるもののみ(かつ、反復回数が回で最小のペアより小さいもの)を列挙すればよいです。さて、そのようなペアはいくつあるでしょうか。
実はこれは個です。
まず、の場合、条件を満たすペアはの個です。
の場合、回反復させると左に述べたようなペアになるようなペアは個あります。そして、に対しても満たすことが分かります。この場合はに対してのみが満たされます。このような操作をとします。この時、ができる回数は反復回数が回のなかで最小のものは回、それ以外のペアは回と分かります。(が小さい範囲で実験すれば導くことができます。)よって、個です。以降も同様に示せます。
よって、反復回数が回となるペアを列挙するとき、反復回数が回となるようなペアをとしたとき、回となるペアの候補にを追加します。そして、それらの中で最小のものを選び、としたとき、を追加すればよいです。
この後は、列挙した反復回数が回となるペアに対して、それが作れるか(作れるとき何通り作れるか)を判定すればよいです。この時、とをしても作れる場合があるので注意してください。
計算量は時間制限が秒のこともあり、前準備も各クエリの処理も十分間に合う速度で行えます。
感想
考察もステップを踏んで実験などを行っていけば無理なく性質が示せますし、実装も軽いので楽しい問題でした。