SRM546 Div1 250
問題
Xが非負の整数であるとき、以下の性質を持つ無限列をXのKleofas tailという。
- 数列の最初はX
- 偶数の数字の次の要素は、その数字の半分にしたもの
- 奇数の数字の次の要素は、その数字から1引いたもの
例えば、X=60の場合は、60,30,15,14,7,6,...となる。
AからBの間の数字で、1度以上数字Kが出現するものの個数を答える。
考え方
逆に1から偶数の時は2倍、奇数の時は2倍にしたものと1を足したものを書き出していってみる。
すると、各数字は1回ずつしかでてこないことがわかる。
さらに2倍していく方は2の累乗で増えていくことから、O(log N)で探索していっている。
与えられるKに対して、上記の操作を繰り返して、A〜Bに当てはまる数をカウント。
K=1,2の場合は、ほぼすべての数字なので、これだけ探索せずにO(1)で返すようにすれば間に合う。