一見して端からDPすれば良さそうに見える。つまり、dp[x]:=位置xから始まる最長の部分列の長さ、としてdp[N−1]=1から逆順に埋めていく方法が考えらえるが、単純にdp[x]←1+max{dp[y]:x∣yかつx<yかつAx<Ay}と遷移すると間に合わない。
約数の数があまり多くないことを利用すると遷移の数を減らせそう。つまり、Ay(<Ax)がAxの約数であるような$y(
dp[y]←max(dp[y],1+dp[x])
と遷移したい。ただ、これでは同一の約数がたくさん存在するときに遷移先の候補が減っていない。同一の約数についてはいちばん右のものだけ見ればよいから、
stack[k]:=数列(Ai)中に登場する整数kの位置を降順に保持したスタック
を最初に作っておいて、適当にポップしながらスタックの先頭にだけ遷移すればよい。