m個の素数を用いてd=p1×p2×⋯×pmと素因数分解します.
買い物が終了したあとxがdで割り切れるための条件は,各pi(1≤i≤m)に対して,
xがpiで割り切れることと同値です.
これはどの素因数を持つ整数をすでに購入しているかという状態に持つbitDPにより求めることができます.
時間計算量はdを素因数分解したときの素因数の個数をmとして
O(d+2m×N)です.小さい方からi番目の素数をPiと表すことにする(つまり,P1=2,P2=3,P3=5⋯)とおくと,
P1×P2×⋯×P10=8700621930≥109より,dの素因数の個数は高々10個であることがわかるため
この制約下でこの解法は十分高速に動作します.