9
Bit Map writer komiya tester tomerun

Bitmap

  • Upload
    tomerun

  • View
    238

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Bitmap

Bit Map

writer : komiya

tester : tomerun

Page 2: Bitmap

問題概要

ビット演算を用いて定義された写像が与えられるので、 50文字以下に縮めてください。

Page 3: Bitmap

着眼点

ビット演算は and, or, xorだけで、各ビットは互いに干渉せず全て独立である。

したがって、関数 fを表現するには f(0)と f(~0)の値が分かれば十分。

Page 4: Bitmap

解の構成

各ビット毎に、 0と 1の行き先の組み合わせはたかだか 4通り。

(0, 1) → (0, 0) なら andを噛ませる。

(0, 1) → (0, 1) ならなにもしない。

(0, 1) → (1, 0) なら xorを噛ませる。

(0, 1) → (1, 1) なら orを噛ませる。

結局、任意の関数は次の形で書ける。

f(x)=(((x|a)^b)&c)

Page 5: Bitmap

構文解析

今回は特にスタックオーバーフローの心配もないので、再帰下降構文解析器などで楽にかけます。

Page 6: Bitmap

注意点

f^n(x)を計算する時は、定義どおりに計算するとO(n)かかり TLEするので、何らかの方法で高速化する必要がある。

Page 7: Bitmap

TLE回避 (1)

関数の合成は単位元 (恒等関数 )をもち、結合法則を満たす。

したがって、バイナリ法 (繰り返し二乗法 )を用いることができる。

バイナリ法を用いると f^n(x)は O(log n)で計算できる。

Page 8: Bitmap

TLE回避 (2)

各ビット毎への作用を考えると、 and, or, xorの

どれかを繰り返しているだけ。 andや or演算を繰り返すことに意味はない。 xor演算は偶数回作用させたか奇数回作用されたかだけ調べれば良い。

Page 9: Bitmap

TLE回避 (2)

なので、

f^(奇数 ) = f

f^(偶数 ) = f^2

となる。 ただし、 f^0の場合は例外なので注意。