先离线操作,把询问的下标存到相应的步长容器中,为了保证容器中下标是有序的,先排个序。对于步长step,那就会存在小于等于step个前缀和,想一想取模运算,其实都差不多。下图就是有三个前缀和,s[1],s[2],s[0]。
思路既然有了那就证明一下时间复杂度,那么对于步长step而言,那就会存在step个前缀和,画个图就明白了,那么遍历一次n/step至少可以更新一个询问操作的答案,那么有q组询问,想一想最坏的情况就是询问的step(就是b)尽可能的小,step等于1的时候遍历一次n,step等于2的时候遍历两次n/2,step等于3的时候遍历三次n/3......以此类推,我们前面说了遍历一次n/step至少可以更新一个询问操作的答案,最坏的情况每次只更新了一个答案,询问次数最坏q=3e5,那我们就要求x,step等于x的时候遍历x次n/x,x约等于2q\sqrt{2q}2q
,因此最后时间复杂度就是O(n∗n)O(\sqrt{n}*n)O(n ∗n)。1.6*1e8一秒差不多够了。