分块
考虑到这个问题太具有一般性,没什么性质能搞。分块处理询问即可,大b直接跑,小b预处理。
然后会被卡常数,加上输入优化,调整一下块大小即可。
#include<cstdio>
#include<algorithm>
#define N 300005
#define S 250
using namespace std;
namespace runzhe2000
{
int read()
{
int r = 0; char c = getchar();
for(; c < '0' || c > '9'; c = getchar());
for(; c >='0' && c <='9'; r = r*10+c-'0', c = getchar());
return r;
}
typedef long long ll;
struct query{int a, b, id;}que[N];
int w[N], n, m, qcnt, ccnt;
ll sum[N], ans[N];
bool cmp(query u, query v){if(u.b != v.b) return u.b > v.b; else return u.a > v.a;}
void main()
{
n=read();
for(int i = 1; i <= n; i++)w[i]=read();
m=read();
for(int i = 1; i <= m; i++)
{
int a=read(),b=read();
if(b >= S) for(int j = a; j <= n; j += b) ans[i] += w[j];
else que[++qcnt] = (query){a, b, i};
}
sort(que+1, que+1+qcnt, cmp);
int cur = 1;
for(int i = S-1; i && cur <= qcnt; i--)
{
for(int j = n; j && que[cur].b == i; j--)
{
sum[j] = j+i<=n ? sum[j+i] + w[j] : w[j];
for(; que[cur].a == j && que[cur].b == i; cur++) ans[que[cur].id] = sum[j]; ccnt++;
}
}
for(int i = 1; i <= m; i++) printf("%I64d\n",ans[i]);
}
}
int main()
{
runzhe2000::main();
}