バチャ記録&自分用解説 Codeforces Round #628 (Div. 2)
Codeforces Round #628 (Div. 2)
Div2だから適当に全完出来るかにゃーとか思いながらバチャに臨んだのれふが, すごい回だった……
後ろ2問, もっと解かれると思って出題したのかにゃ……という感じの問題ではあった(解説見たら理解できる類だった)のれふが, 厳しい……
奇しくも同日に開催されたパナソニックコンに続き, Rated対象の人が大変そうなコンテストだった……?とか思ったり.
(後ろ2問がきついのに対し, 前4問は全体的にギャグ風味なのが尚更……)
A.EhAb AnD gCd
問題概要
2以上の整数に対し, を満たす正整数の組を一つ求めよ.
※はそれぞれの最大公約数と最小公倍数
解法
とした場合を考えると, となるため,よりとすればよいと分かる.
B.CopyCopyCopyCopyCopy
問題概要
要素の正整数列を回繰り返して得られる数列の最長部分増加列(LIS)の長さを求めよ.
解法
中に種類の正整数が現れるとする. 明らかに, 答えはより大きくならない. また, 種類の正整数のうち番目に小さい値を回目に繰り返された数列から得るようにすることで, 長さのLISを常に得ることが出来る.
C.Ehab and Path-etic MEXs
問題概要
頂点の木の辺に, ()の最大値が最小になるよう以上以下の整数を重複なく番号づける方法を一つ求めよ.
※は頂点間の辺の番号として現れない最小の非負整数
解法
が最大になりうるの組として, 端点のみを考えればよい.
端点が2つのとき(パスグラフのとき), 辺の番号の付け方によらずの最大値は一定.
端点が3つ以上の時, それらに隣接する辺に0,1,2,...と小さいほうから番号付けることでの値を2にすることができる.
D.Ehab the Xorcist
問題概要
すべての要素の排他的論理和がで, すべての要素の和がになるような要素数最小の正整数列を求めよ. (存在しない場合-1と出力)
解法
比較的明らかなケースとして,以下のものがある.
・のとき, 答えは.
・でのとき, 答えは.
・のとき, 答えは存在しない.
そうでないとき, 同一の整数同士の排他的論理和が0になることを考えると(最小とは限らない)答えとして が思いつくので, これをもとに色々考える. 具体的には, 以下の場合を考える.
・が2で割れないとき, 和と排他的論理和の偶奇が異なるので答えは存在しない.
・との排他的論理和がこれらの和に等しい場合, (であることから要素数1の答えは存在しないため)答えは.
・以上の条件をいずれも満たさない場合, より少ない要素数の数列を構成できないため, これが答え. (とにおいてともに立っているbitについて考えると, 2つの数では条件を満たすことが出来ないと分かる.)
E.Ehab's REAL Number Theory Problem
問題概要
どの要素もその約数が7個以下であるような正整数列の(空でない)部分列であって, その総積が平方数になるようなものの要素数の最小値を求めよ. (存在しない場合-1を出力)
解法
約数が7個以下という条件から, どの要素もその素因数はたかだか2種類である. また, 約数に平方数を含む場合, その平方数で割った値に置き換えても答えは変わらない. この処理を行うことで, どの要素も「1」, 「」, 「」と表せる(は素数で, ).
ここで, 1と素数を頂点としたグラフを考え, 各要素に対し以下のルールで辺を張る.
・その要素が「1」と表せるならば1に対応する頂点に自己ループを張る.
・その要素が「」と表せるならば1とに対応する頂点の間に辺を張る.
・その要素が「」と表せるならばとに対応する頂点の間に辺を張る.
すると, このグラフの閉路のうち, 最小のものの長さが答えである. (辺を通ることが2頂点の積として表せる要素を選ぶことと等しく, 閉路ならばどの要素も偶数回ずつ掛け合わせられるため)
最小の閉路を求めるには, 全頂点からbfsをし, (最短路として)使われなかった辺のうち始点と他の頂点を結ぶものがあるならば, その頂点までの距離+1が閉路の長さとして得られる. しかし, の要素の最大値()以下の素数は78948個あり, 最悪ケースにおいて間に合わない. そこで, 辺のうち少なくとも一方は以下であることを考え, 始点を以下の素数(168個存在する)および1に対応する頂点からのみに限る事で, 十分高速に答えを求めることが出来るようになる.
F.Ehab's Last Theorem
問題概要
頂点の無向グラフが与えられる. 以下のうち, どちらか一方の問題を解け.
・要素の独立集合(どの2頂点も辺で隣接していないような頂点の集合)を求めよ.
・長さ以上の単純閉路(同じ頂点を二回以上通らない閉路)を求めよ.
解法
適当な頂点を根としたdfs木を作る.
もし現在見ている頂点からその先祖へと辺が伸びているなら, 深さを比較し, その差が以上ならば, これは長さ以上の単純閉路なのでこれを出力する. 以下, これが見つけられなかった場合(すなわち, 独立集合を見つけなければならない場合)を考える.
現在見ている頂点に隣接する頂点すべてについて処理を終えたあと, 以下の処理を行う.
・もしその頂点を独立集合として選べるならば, その頂点自身を独立集合として選ばれる頂点の集合とし, 自身に隣接する頂点を独立集合として選べない頂点として記録する.
この処理を行う時点で子孫について独立集合に加える処理は終わっているため, 頂点を選んだ場合の先祖への影響を考える.
ここで, 深さの差が以上であるような先祖が存在しないことから, その頂点を選ぶことで選べなくなる先祖は高々個といえる(鳩ノ巣原理).
故に, ある頂点を選ぶことで, 独立集合の要素数が1増える代わりに最大で(その頂点自身を含め)個の頂点が選べなくなるといえるが, この考えのもと, 要素以上の独立集合が得られることが示せるため, 元の問題を常に解くことができる.
証明の流れ:
ならば, 要素以上の独立集合が得られると言える.
ここで, より厳しい不等式として, を示すこととする.
この不等式は, 両辺をで割って逆数を取ることでとなり, (天井関数で増える値は1未満なので)正しいといえる.
Tutorialには貪欲法をもとにした解法も載ってました.