1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl
using namespace std; typedef long long LL;
const int N = 300000 + 16;
struct Query { int st, k, id; LL ans; Query(int st, int k, int id): st(st), k(k), id(id) {} Query() {} };
LL a[N], v[N]; vector<Query> Q[N]; int main(int argc, char **argv) { int n; while(~scanf("%d", &n)) { for(int i = 1; i <= n; ++i) scanf("%I64d", &a[i]); for(int i = 1; i <= n; ++i) Q[i].clear(); int q; scanf("%d", &q); vector<int> have; for(int i = 0; i < q; ++i) { int st, k; scanf("%d%d", &st, &k); have.push_back(k); Q[k].push_back(Query(st, k, i)); } sort(have.begin(), have.end()); have.erase(unique(have.begin(), have.end()), have.end()); int sq = sqrt(n + 1); for(auto k : have) { if(k >= sq) { for(auto &query : Q[k]) { int pos = query.st; LL res = 0; while(pos <= n) { res += a[pos]; pos += k; } query.ans = res; } } else { fill(v, v + n + 1, 0); for(int i = n; i >= 1; --i) { v[i] = a[i]; if(i + k <= n) v[i] += v[i + k]; } for(auto &query : Q[k]) query.ans = v[query.st]; } } vector<LL> ans(q); for(auto k : have) for(auto query : Q[k]) ans[query.id] = query.ans; for(auto x : ans) printf("%I64d\n", x); } return 0; }
|