D - Choosing Up Sides
有志が作ったこの記事の解説画像D - Choosing Up Sides - blogskol https://t.co/uX0A5alb4s
— ゴジラ@競プロ (@gojira_kyopro) 2021年1月17日
完全に理解した pic.twitter.com/7pRDFtWSpd
一人を固定してやると
一回の試合でチームになる人数:
自分以外の人数:
なので試合回数をとすると が成り立つ必要がある
っぽい*1ので が の倍数であることが言える
(Aをなるべく小さくしたいので)取り敢えず が出来ると信じて考える(この時 である)
2べきの問題は再帰を使えることが多いので再帰を検討する
つまり、 のケースについては解法を持ってる時を仮定する
のケースは 人に対して行うものなので、 人を半分ずつグループX,グループYに分けてあげてグループごとにの解法を適用することを考える
の解法は各ペアに対して同じチームになる回数を にする
今は同じチームになる回数を 回にしたい
二つを見ていると(2べきの形から)取り敢えず各グループ の解法を二回適用してあげたくなる
実際、XとYそれぞれについて の解法を二回適用したのちX vs Yを一回行えばグループ内の各ペアについて同じチームになった回数は
で上手くいく
一方でXY間のペアについてだけど、 の解法を一通り行うのにかかる回数が(同じチームになってほしい回数と等しい) であることに注目すると、 の解法を二周行う時に各XY間のペアについて一周は同じチーム、もう一周は違うチームとなってくれればいいことが分かる
これは実際1周目と2周目でY側だけABを反転させることで達成できることが簡単に分かる
コードでは実際に番目の答えを構築してから番目の答えを作ってる
atcoder.jp
*1:互除法の操作を考えると自明