とりあえず「簡単すぎる」ほうの問題を解く。dp[x][y]:=商品を最初のx種類からちょうどy個選ぶ方法の総数、とする。dp[x][y]=d[x−1][y]+dp[x−1][y−1]+...+dp[x−1][y−ax]と遷移できるが、これでは間に合わないので累積和を考える。つまりDP[x][y]:=商品を最初のx種類からy個以下選ぶ方法の総数としたとき、
DP[x][y]=dp[x][0]+dp[x][1]+...+dp[x][y]
DP[x][y]=DP[x][y−1]+dp[x][y]
dp[x][y]=DP[x−1][y]−DP[x−1][y−ax−1]
が成り立つので、
DP[x][y]=DP[x][y−1]+DP[x−1][y]−DP[x−1][y−ax−1]
というO(1)の遷移を導ける。ここからyを一個ずらした漸化式DP[x][y−1]=DP[x][y−2]+DP[x−1][y−1]−DP[x−1][y−ax−2]を引くと、dpについても同じ形の漸化式が得られる:
dp[x][y]=dp[x][y−1]+dp[x−1][y]−dp[x−1][y−ax−1]
これで簡単なほうの問題が解けた。
さて、ここでN番目の商品とi番目の商品を入れ替えて同じDPをすることを考える。この配列をdpiとするとき、dpiはdpと同じ遷移で求まり、しかもN種類の商品を処理すると同じ値になるはずである。つまり、任意の個数yについてdp[N][y]=dpi[N][y]が成り立つ。したがって
dpi[N][y]=dpi[N][y−1]+dpi[N−1][y]−dpi[N−1][y−ai−1]
という等式から
dp[N][y]=dp[N][y−1]+dpi[N−1][y]−dpi[N−1][y−ai−1]
が導け、整理すると
dpi[N−1][y]=dp[N][y]−dp[N][y−1]+dpi[N−1][y−ai−1]
となる。i番目の商品を除いた場合に全体でちょうどy個の商品を選ぶ方法の総数をf[i][y]とするとき、f[i][y]=dpi[N−1][y]であるから、
f[i][y]=dp[N][y]−dp[N][y−1]+f[i][y−ai−1]
となり、fについてDPすればクエリにO(1)で答えられることになる。O(NM+Q)。
戻すDPというらしい。
参考:
http://sigma425.hatenablog.com/entry/2015/07/31/121439