区間和は「累積和の差分」で考えてみましょう。水色diff です。
問題
数列 の区間 で が の倍数であるものの数を求めよ。
制約
考察
の累積和 を計算し、
とします。
求める値は、 の剰余の数列 で、同じ値が何度出てくるかの総和と等しくなります。
Pythonでは collections.Counter
が便利です。
values()
で出現回数が取得できます。
実装例
N, M = map(int, input().split()) A = list(map(int, input().split())) S = [0] + list(itertools.accumulate(A)) T = [s % M for s in S] counter = collections.Counter(T) ans = sum(n * (n-1) // 2 for n in counter.values()) print(ans)