Codeforces Round #486 (Div. 3) D. Points and Powers of Two
問題概要
数直線上の 個の点 が与えられる. この中から適当な個数の点を選び, 選んだ点を としたとき任意のペアについて が の累乗になるようにしたい. このとき, 最大何個の点を選ぶことができるか?構成とともに示せ.
制約
解法
明らかに 点のみを選ぶことは可能です. また, 点選ぶのも, ある点 に対して選びうる点は だけですから 適当な の範囲について対応する点が存在するかどうかを判定すれば良いです.
点選ぶ時の条件は何でしょうか? なる三点を選ぶとき, を満たすことが必要です. もし となるなら, は少なくとも二つの bit が立ってしまいます(二進数で考えるとわかりやすいです). この判定も候補が定数個なので適切に実装すれば実行時間制限以内に解が存在することを確かめることができます.
点以上選ぶのは明らかに不可能です. を選ぶならば, 点の時の議論から がなりたたければなりませんが, このとき は明らかに の倍数になってしまいます.
以上より, 確かめる解の大きさの最大値は なので, その部分を全探索すれば良いです.
実装
解の上限が大きさ だとあらかじめわかっているので, の解があればそれをすぐに出力しています.