Mitsubachiのメモ

組合せ論をしています

AGC015-F(Kenus the Ancient Greek) 解説


 

初めて解説記事を書くので至らぬ点もあると思いますが、よろしくお願いします。

では、行きましょう。

 

問題概要

Q個のクエリで整数X,Yが与えられる。X以下のA,Y以下のBからなるペア(A,B)のうち、ユークリッドの互除法の反復回数が最多となるものを求め、またその回数となるようなペアの数を出力せよ。

 

ステップ1 反復回数の最大値

まず、X_iY_iを逆にしても結果は変わらないので、以降はX_i \leq Y_iとなるようにswapされているとします。

反復回数がN回となるようなペアを列挙して(ただし、ペアの1つめの要素が2つめの要素より小さいとします)sortした時に一番先頭に来るペアが、反復回数がN回となるペアの中で1つめの要素が最小(sortした時点でこれは満たされる)かつ2つめの要素が最小だとします。

この時、反復回数がN回となるようなペアの中で一番小さいペアを(a,b)とすると、反復回数がN+1回となるようなペアの中で一番小さいペアは(b,a+b)です。

このような性質があれば反復回数の最大値を求められるのが楽そうです。

ではこの性質が満たされるNはあるのでしょうか。実は最小でN=2のときが満たし、これよりN\geq2のときこの性質が満たされることが分かります。

反復回数が2回となるようなペアの中で一番小さいペアは(2,3)です。(ペアの小さい方の数字が0なら反復回数は0で、1なら1になるためです。出力例1の説明からでもこの事実は導けると思います。)

よって、反復回数が3回のペアのうち最小のものは(3,5)4回のペアのうち最小のものは(5,8)...とフィボナッチ数列的に求められます。後は各クエリごとに反復回数がn回のペアを作れるか調べればよいです。(二分探索でもよいですが、フィボナッチ数列の第100項は10^{18}を軽く超えるので全探索でも十分間に合います)

また、反復回数の最大値が1となるようなクエリの判定はX_i2未満またはY_i3未満のどちらかが満たしているかをチェックすればよいです。

 

ステップ2 反復回数の最大値をとるペアの数

反復回数の最大値をZとします。

まずZ=1の時、0が含まれていなければ必ず反復回数は1になるので、答えはX_iY_iです。

以降はZ\geq2の場合を考えます。

反復回数がT回となるようなペアをあらかじめ全て列挙して、それを作ることができるかを判定すればよいですが、(2,3),(2,5),(2,7)...の反復回数は全て2回であり、これは難しいです。しかし、(2,3+2t)は全て反復回数が2回であることを利用すると、3+2t \leq Y_iを満たすtの最大値を求め、これをペアの数に足し合わせばよいです。

これを利用すると、反復回数がT回となるようなペアを全て列挙するときに、そのペアを(a,b)としたときに、b \leq 2aが満たされるもののみ(かつ、反復回数がT+1回で最小のペアより小さいもの)を列挙すればよいです。さて、そのようなペアはいくつあるでしょうか。

実はこれはT個です。

まず、T=2の場合、条件を満たすペアは(2,3),(3,4)2(=T)個です。

T=3の場合、1回反復させると左に述べたようなペアになるようなペアは2個あります。そして、(a,b)に対して(b,2b-a)も満たすことが分かります。この場合は(3,5)に対して(5,7)のみが満たされます。このような操作をRemakeとします。この時、Remakeができる回数は反復回数がT回のなかで最小のものは1回、それ以外のペアは0回と分かります。(Tが小さい範囲で実験すれば導くことができます。)よって、3個です。以降も同様に示せます。

よって、反復回数がT+1回となるペアを列挙するとき、反復回数がT回となるようなペアを(a,b)としたとき、T+1回となるペアの候補に(b,a+b)を追加します。そして、それらの中で最小のものを選び、(a,b)としたとき、(b,2b-a)を追加すればよいです。

この後は、列挙した反復回数がZ回となるペアに対して、それが作れるか(作れるとき何通り作れるか)を判定すればよいです。この時、X_iY_iswapしても作れる場合があるので注意してください。

計算量は時間制限が5秒のこともあり、前準備も各クエリの処理も十分間に合う速度で行えます。

 
感想

考察もステップを踏んで実験などを行っていけば無理なく性質が示せますし、実装も軽いので楽しい問題でした。