Upload
tomerun
View
238
Download
0
Embed Size (px)
Citation preview
Bit Map
writer : komiya
tester : tomerun
問題概要
ビット演算を用いて定義された写像が与えられるので、 50文字以下に縮めてください。
着眼点
ビット演算は and, or, xorだけで、各ビットは互いに干渉せず全て独立である。
したがって、関数 fを表現するには f(0)と f(~0)の値が分かれば十分。
解の構成
各ビット毎に、 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)
構文解析
今回は特にスタックオーバーフローの心配もないので、再帰下降構文解析器などで楽にかけます。
注意点
f^n(x)を計算する時は、定義どおりに計算するとO(n)かかり TLEするので、何らかの方法で高速化する必要がある。
TLE回避 (1)
関数の合成は単位元 (恒等関数 )をもち、結合法則を満たす。
したがって、バイナリ法 (繰り返し二乗法 )を用いることができる。
バイナリ法を用いると f^n(x)は O(log n)で計算できる。
TLE回避 (2)
各ビット毎への作用を考えると、 and, or, xorの
どれかを繰り返しているだけ。 andや or演算を繰り返すことに意味はない。 xor演算は偶数回作用させたか奇数回作用されたかだけ調べれば良い。
TLE回避 (2)
なので、
f^(奇数 ) = f
f^(偶数 ) = f^2
となる。 ただし、 f^0の場合は例外なので注意。