No.206

大きさが 番目のビットを立てた BitArray を作る. も同様にして作る.

あとは BitArray を1ビットずつずらしながら BitArray との AND を取り, 立っているビット数を数える.

ビットシフト, AND 演算, popcnt を駆使して定数倍高速化で間に合う.

別解:

とすると,

は, となる の組み合わせの数である.

であるから, ずらしたときの積集合の数となる.

よって, を FFT で計算すればいい.