Codeforces Beta Round #79 (Div. 1 Only)
珍しく(というか初めて?)深夜2時から2時間。
ABCでpretest通過したくせに、
- A.問題文読み間違え
- B.方針全然駄目->TLE
- C.タイプミス
で0完と結果は惨敗だったが、Cだけ解法を載せておく。そしてBの解法が知りたい。。
Bの解法は何人かの手助けのおかげで理解することが出来た。感謝。BITを使う。BITの葉をバスの始点と終点、さらに0とnでの組合せ数とする。終点でソートしてBITを使ってその地点で降りる組合せ数(始点から終点-1までの区間での組合せの総和)を計算する。葉の左から右へ値を更新していくイメージ。
C. Vectors
問題概要
ベクトルA,B,Cが与えられる。
ベクトルAを任意の回数だけ90度回転したりベクトルCを足したりして、ベクトルBが作れるか答えよ。
解法
ベクトルAの最初の向きを決めれば、4方向のベクトルCを何回かずつ足すことで、全てのベクトルの1/4?作ることが出来る。
さらにベクトルAの最初の向きを4方向全て試せば、全てのベクトルを作ることが出来る。
初期のベクトルAの向きを元のままとするときのみを考える。
ここで、とする。
また、ベクトルCのそのままの向き、90度回転させた向き、180度回転させた向き、270度回転させた向きについて、足す回数をそれぞれとする。
すると、
ここで、とすれば、
となる。
ここで、P,Qは任意の整数を取ることが出来るから、この連立方程式が整数解を持つかどうか調べればいいことになる。
P, Qについて解くと、
これが整数になる、つまり分母で分子が割り切れれば、ベクトルAのその向きからベクトルBが作れることになる。
ベクトルAを4方向試せば終わり。