ブログ名

競技プログラミングやお歌のお話をする高菜です。

yukicoder contest 236 解法

コンテストページ

yukicoder contest 236

✔A - Add

AB 以下のチェックリストを作って、x ≦ B, y ≦ A を全探索です。

✔B - Convolution

GCD は ( a, b ) -> ( a, a+b ) で不変ですから、この性質をふんだんに使いましょう。

まず、i & j=k とありますが、これは i & j ⊇ k に書き換えてよいです。 すると因数分解ができます。各 i に対してそれを包含する添字全体に渡る和を書いたような数列の GCD を計算して 2 乗をすればよいです。

さらに、この和も先程のように掃き出し法をすると、単に a の GCD を計算すれば良いことがわかります。−1 は 0 にしておきましょう。

✔C - Inversion

N が P の平方剰余であることが、偶置換である条件であることをエスパーしました。(はい!?)

ここからは手慣れた手付きです。平方剰余の相互法則でググり、Wikipedia に書いてある定理を写しました。

✖D - Hadamard

わかりませんでした。

✖ E - Present

  • 移動できる場所の個数は 2 の N 乗です。

  • 移動できる場所の個数を最大化するような S の個数は、M 次元空間の線形独立な N 個のベクトルの組の個数を N の階乗で割ったものです。

  • 移動できる場所の個数を最大化するときの、移動できる場所の集合の個数は、M 次元空間の N 次元線形空間の個数です。

どれも、一般線形群の元の個数を計算する感じで計算すれば、Θ(N) で計算することが出来ます。

自叙伝

ところで私は「 N ≦ M なら簡単なのに……」と頭をひねっていました。それの assert を入れて通るかどうか、試そうかとも思ったのですが、ギリギリまで粘りました。終了 15 分前、諦めてそれだけ提出しようと書き始めたときです。気づいてしまったんですよね。

制約は N ≦ M です。

これなら(☆ 4 にしては)簡単じゃないんですか!!

一般線形群に慣れているからそう感じるだけかもしれませんが、そのあたりメタ読みが狂いがちですから、気をつけたいところです。