記録
Dashboard - Codeforces Round #818 (Div. 2) - Codeforces
まったり参加で3完, 約17000人中1336位でした
Dは誤読ミス、Eは間に合わなかった…
解法・反省
A
Problem - A - Codeforces
提出 4分 (0)
解法
2変数のlcm, gcdに対して次の等式がある. これは有名だとおもう.
だから,
となる.
一方, サンプルを眺めるとCF Div.2-A問題らしく, O(1)っぽい. 周期があるんだろうか. 周期は
っぽい. 1から5までのサンプルはあるので, 6の値を調整してサンプルが全部合うようにする. 投げるとAC.(1個目の解法)
厳密には, 新たに
を絶対使うとき,
のとき
.
のときは
(ただし
が整数のとき)の2種.
のときは
の2種.
これらはそれぞれ異なるから,
の倍数→
,
の倍数→
,
の倍数→
とできる.
解ができたが, 主客転倒すると
に帰着できる.(2個目の解法)
提出
Pypy3
Submission #170595385 - Codeforces
Pypy3
Submission #170715002 - Codeforces
B
Problem - B - Codeforces
提出 20分 (0)
解法
ぼくは英語が読めない. 問題文がわからないんだ.
問題は構築問題で, どの隣接する連続kマス(kはnの約数)にも文字「X」が1個以上含まれるようなもののうち,「X」の数が最小になるものを出力するもの. ただし, 入力で与えられる座標
は必ず「X」を使わないといけないらしい.
n×nのテーブルを, k×kの小ブロックによって (n/k)×(n/k)に分割する. 小ブロックはどれも同じように繰り返し, 小ブロックは
とする.
これで連続kマスに文字「X」が1個以上必ず存在するようにできて, しかもそういうものとして最小と証明できる(鳩の巣論法とかで)
しかし, これでは
の条件を確保できない. 解決は簡単で, たんに小ブロック内で条件確保するために順列をswapすればよい.
提出
PyPy3
Submission #170603358 - Codeforces
C
Problem - C - Codeforces
提出 28分 (1)
解法
問題文は巡回っぽい操作をさせている. 操作は可換じゃない.
まず
は増加させる方にしか行けないから,
なら駄目. もちろん, 操作して
にするのも駄目.
ならそのままがいいし,
にとっても
がでかければでかいほど増加できる最大値が高くていい.
つまり, 操作を繰り返すことをまとめたとき,
とできる.
ここで, 本番は後ろから操作することを何回か繰り返した嘘解法で通したが, 自明な反例があったので投げたらhackできた. 弱すぎる.
結局,
でないなら,
に対して
が
以下であることが必要.
提出
Pypy3 (嘘解法, Hacked)
Submission #170607146 - Codeforces
Pypy3(多分正しい)
Submission #170719228 - Codeforces
D
Problem - D - Codeforces
提出 コンテスト後
解法
問題文を誤読しまくって結局何も分からなかった.
・Madokaはトーナメントの参加者と, それぞれのトーナメントの勝敗をあらかじめ決定する.
・スポンサーは, トーナメントの勝敗を最高
回変えて優勝者の番号を変える.
意志の考察としては
・Madokaはトーナメントの勝者の番号をできるだけ小さくしたいが, スポンサーは勝者の番号をできるだけ大きくしたい.
となる.
Madokaが定める最適なトーナメントにおいて, スポンサーが達成できる勝者の番号の最大値を求めればいい.
ならスポンサーは最も番号が小さい人を優勝させられるので
.
トーナメントはこのような形に帰着できるが, 勝利するためにどのくらい変更すればいいかは緑色になる. 勝利するための変更数を小さい方から, 番号が小さい順に埋めればいい.
変更数が
であるものは
個あることが証明できる!(
エスパーもできる)
だから結局答えは
となる. 二項係数前処理でok.
提出
Pypy3
Submission #170657625 - Codeforces
E
Problem - E - Codeforces
提出 コンテスト後
解法
A問題の考察のごとく
となる.
愚直にやると自由度2なので
で求められる. 高速な言語でも工夫しない限りちょっと無理そう.
を固定する. このとき, 残りは
を
に分配する. このとき,
としたら,
かつ
である. (
は
は
で割り切れること)よって,
である.
つまり,
は必ず
の約数となる. この手の問題には
主客転倒が効く. 愚直に計算する代わりに, gcdが
となるようなものの個数を数え上げる手法である.
今回,
に対して,
and
となるような
は
個ある.
そこから,
かつ
に対して,
となるようなものをすべて除外すればよい.
となる個数を
とする. いま
は計算できた.
それが問題に寄与するのは
である. これは簡単に計算できる.
の約数の個数を
として,
を固定すると
の計算量で計算できた.
我々は
で求めることができた. これでACできる.
計算量は後者は
だが, 前者は正直わからなかった. 手元環境でかなり速かったので提出した.
解法をまとめるとかなり簡単だが, これを考えつくまでにかなり時間がかかった. コンテスト中に通したかった…
提出
Pypy3 Submission #170650505 - Codeforces