解説:#15 Multiple count

製作者:QCFium


## 解説 愚直な方法は$O(NQ)$で間に合いません。 ここで$K$が入力で一回だけ与えられ、クエリによって変化しないことを考えると$B_i = (A_i$が$K$で割り切れるなら$1$、そうでないならば$0)$とすることで以下のような問題が解ければよいです。 各クエリについて$B$の$X_i$番目から$Y_i$番目の和を求めよ。 これは$B$について累積和を構築しておくことで各クエリ$O(1)$で答えることができます。 実装例は以下の通りです。std::cin/std::coutは遅く、今回のように入力量が多い場合はそれだけでTLEすることがあるので代わりにscanf/printfを使いましょう。 ``` #include <bits/stdc++.h> int ri() { int n; scanf("%d", &n); return n; } int main() { int n = ri(), k = ri(); int a[n]; for (auto &i : a) i = ri(); int b_sum[n + 1]; b_sum[0] = 0; for (int i = 0; i < n; i++) b_sum[i + 1] = b_sum[i] + (a[i] % k == 0); int q = ri(); for (int i = 0; i < q; i++) { int x = ri() - 1; int y = ri(); printf("%d\n", b_sum[y] - b_sum[x]); } return 0; } ```