mm個の素数を用いてd=p1×p2××pmd=p_1 \times p_2 \times \cdots \times p_mと素因数分解します.

買い物が終了したあとxxddで割り切れるための条件は,各pi(1im)p_i(1 \leq i \leq m)に対して, xxpip_iで割り切れることと同値です.

これはどの素因数を持つ整数をすでに購入しているかという状態に持つbitDPにより求めることができます.

時間計算量はddを素因数分解したときの素因数の個数をmmとして O(d+2m×N)O(\sqrt{d} + 2^m \times N)です.小さい方からii番目の素数をPiP_iと表すことにする(つまり,P1=2,P2=3,P3=5P_1=2,P_2=3,P_3=5\cdots)とおくと, P1×P2××P10=8700621930109P_1 \times P_2 \times \cdots \times P_{10} = 8700621930 \geq 10^9より,ddの素因数の個数は高々1010個であることがわかるため この制約下でこの解法は十分高速に動作します.