Floor Div Convolution?

2 secs 1024 MB
ecottea's icon ecottea

解説

便宜上,整数列 A,BA, B の範囲外の値を全て 00 とします.和の範囲を定める条件 ij=k\lfloor \frac{i}{j} \rfloor = k

jki<j(k+1)j k \leq i \lt j (k + 1)

と同値なので,k1k \geq 1 に対する CkC_k

Ck=j=1N/kBji=jkj(k+1)1AiC_k = \sum_{j=1}^{\lfloor N/k \rfloor} B_j \sum_{i = j k}^{j (k + 1) - 1} A_i

と書き直せます.AA の累積和を O(M)O(M) で前計算しておけば,この式に従って各 k=1,2,,Nk = 1, 2, \ldots, N に対する CkC_k をそれぞれ O(Nk)O(\frac{N}{k}) で計算することができます.k=0k = 0 のときは

C0=j=1MBji=0j1AiC_0 = \sum_{j=1}^{M} B_j \sum_{i = 0}^{j - 1} A_i

となり,こちらも AA の累積和を用いれば O(M)O(M) で計算できます.全体の計算量は O(M+NlogN)O(M + N \log N) となり本問の制約下で十分高速です.

想定解(C++)