ARC135 参加記録
コンテスト中AC:A,C
Bはコンテスト後自力AC。もう少しで解けそうでした。
A - Floor, Ceil - Decomposition
実際に10まで、xとfloor(x/2)×ceil(x/2)のどちらが大きいか手計算しました。
すると、
- x≦4なら、x≧floor(x/2)×ceil(x/2)
- x≧5なら、x<floor(x/2)×ceil(x/2)
となりました。大きめの数で試してもx<floor(x/2)×ceil(x/2)となり、その差は大きくなっていくので、厳密でないものの一般のxでもこれが成り立つと考えました。
よって、
- x≦4ならそのまま、そうでなければfloor(x/2)とceil(x/2)に置き換える。
という解法が成り立つと考えました。
実装ですが、この手の問題ではメモ化再帰を使える場合が多いです。
メモ化することで、xが偶数なら状態は1/2になりますし、厳密ではないものの、全状態数は十分に少ないと見積もりました。
実際に提出してみると、ACできました。
(最大の1018くらいは試しておけばよかったです。)
厳密でなかった部分は、前者は公式解説に証明がありました。後者も証明できるそうです。(具体的な証明はありませんでした。) 提出コード
B - Sum of Three Terms
及びが決定すると、のを決定できます。
また、という制約があるので、に関する何らかの制約が得られそうです。
まで、列挙してみます。
のみからなる定数部分をとしておきます。は、
のとき、
のとき、
として、計算できます。
次に、に関する制約式を得たいので、それぞれのでの係数をとします。
これも以下のように計算できます。
のとき、
のとき、
のとき、
これを基に実際に実装して計算してみたところ、以下の事実に辿り着きました。
のとき、
のとき、
のとき、
そのため、という制約から、以下の3種類の制約式が得られます。
のとき、
のとき、
のとき、
そこで、
の上限を
の下限を
の下限を
とします。初め、です。
これをについて、以下のように更新していきます。
のとき、
のとき、
のとき、
これが終了したとき、
という制約式が得られ、これを満たすようなを設定します。
まず、
のいずれかを満たす時、解なしです。
そうでないとき、
を満たすようにするには、は、それぞれの下限である、にしておくのが最善です。
そのため、であれば解なしです。
そうでなければ、、としてを構築できます。
(下記実装はiが0-indexedなので、i mod 3の値が異なっています)
提出コード
C - XOR to All
として以下に一例を示します。
と全体のXORをとる。
と全体のXORをとる。
XORは交換法則が成り立ち、かつ、 より、
これより、任意に置き換えを行った場合でも最終的には、
という形になります。
そこで、について、
とした時、最大のを求める問題と読み替えられます。
愚直にこれを計算するととなって、間に合わないため、工夫する必要があります。
ビットの問題では各ビットに着目するのが典型なので、それを基に考えてみます。すると、
- のビット目が0の場合、のビット目はそのまま。
- のビット目が1の場合、のビット目はすべて反転する。
ということがわかります。
そのため、のうち、ビット目が1の個数(または0の個数)さえ分かれば、以下のようにを計算できます。
をの内、ビット目が1である要素の個数とし、
の最大値の最上位ビットをビット目とする。
について、
のビット目が0の場合
にを個分足す:
のビット目が1の場合
にを個分足す。:
このようにすると、全てのをで計算できます。 という制約上、は最大で29なので、のループは最大でも30回となり、余裕を持って間に合います。
なお、操作を一度も行っていない場合も考慮する必要があります。