/*
Vẫn là lối đi cũ: với những dạng bài đếm số đoạn con có tổng thoả tính chất X nào đó
thì ta thử đưa về công thức tổng tiền để xem thử, khi đó bài toán đưa về đếm số cặp (l, r) (l < r)
thoả mãn công thức Y nào đó.
Cụ thể ở bài này:
sum[l, r] chia hết cho n <=> (pref[r] - pref[l - 1]) chia hết cho n
<=> (pref[r]) đồng dư (pref[l - 1]) (mod n)
nên bài toán đưa về đếm có bao nhiêu cặp (l, r) (l < r) sao
cho pref[r] % n = pref[l] % n
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n;
int a[N], pref[N];
int cnt[N];
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pref[i] = (pref[i - 1] + a[i]) % n;
pref[i] = (pref[i] + n) % n; // pref[i] có thể âm nên phải chú ý
}
// lưu ý: nếu x đủ nhỏ thì ta có thể tạo 1 mảng cnt[] để lưu tần suất của x
// nhưng trường hợp x khó để lưu vào 1 mảng (như x âm, hoặc x quá lớn) thì
// các em có thể nghĩ đến việc dùng map (map<int, int> cnt)
ll ans = 0;
for (int i = 0; i <= n; i++) {
ans += cnt[pref[i]];
cnt[pref[i]]++;
}
cout << ans << '\n';
return 0;
}
LyoKCVbhuqtuIGzDoCBs4buRaSDEkWkgY8WpOiB24bubaSBuaOG7r25nIGThuqFuZyBiw6BpIMSR4bq/bSBz4buRIMSRb+G6oW4gY29uIGPDsyB04buVbmcgdGhv4bqjIHTDrW5oIGNo4bqldCBYIG7DoG8gxJHDsyAKCXRow6wgdGEgdGjhu60gxJHGsGEgduG7gSBjw7RuZyB0aOG7qWMgdOG7lW5nIHRp4buBbiDEkeG7gyB4ZW0gdGjhu60sIGtoaSDEkcOzIGLDoGkgdG/DoW4gxJHGsGEgduG7gSDEkeG6v20gc+G7kSBj4bq3cCAobCwgcikgKGwgPCByKSAKCXRob+G6oyBtw6NuIGPDtG5nIHRo4bupYyBZIG7DoG8gxJHDsy4gCglD4bulIHRo4buDIOG7nyBiw6BpIG7DoHk6IAoJc3VtW2wsIHJdIGNoaWEgaOG6v3QgY2hvIG4gPD0+IChwcmVmW3JdIC0gcHJlZltsIC0gMV0pIGNoaWEgaOG6v3QgY2hvIG4gCgkJCQkJCQkgPD0+IChwcmVmW3JdKSDEkeG7k25nIGTGsCAocHJlZltsIC0gMV0pIChtb2QgbikgCgluw6puIGLDoGkgdG/DoW4gxJHGsGEgduG7gSDEkeG6v20gY8OzIGJhbyBuaGnDqnUgY+G6t3AgKGwsIHIpIChsIDwgcikgc2FvCgljaG8gcHJlZltyXSAlIG4gPSBwcmVmW2xdICUgbiAKKi8KCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAoKY29uc3QgaW50IE4gPSAyZTUgKyA1OyAgIAoKaW50IG47ICAgCmludCBhW05dLCBwcmVmW05dOyAgIAppbnQgY250W05dOyAgIAoKc2lnbmVkIG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgCgljaW4gPj4gbjsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY2luID4+IGFbaV07ICAKCQlwcmVmW2ldID0gKHByZWZbaSAtIDFdICsgYVtpXSkgJSBuOyAgICAKCQlwcmVmW2ldID0gKHByZWZbaV0gKyBuKSAlIG47IC8vIHByZWZbaV0gY8OzIHRo4buDIMOibSBuw6puIHBo4bqjaSBjaMO6IMO9IAoJfSAKCgkvLyBsxrB1IMO9OiBu4bq/dSB4IMSR4bunIG5o4buPIHRow6wgdGEgY8OzIHRo4buDIHThuqFvIDEgbeG6o25nIGNudFtdIMSR4buDIGzGsHUgdOG6p24gc3XhuqV0IGPhu6dhIHgKCS8vICAgICAgICBuaMawbmcgdHLGsOG7nW5nIGjhu6NwIHgga2jDsyDEkeG7gyBsxrB1IHbDoG8gMSBt4bqjbmcgKG5oxrAgeCDDom0sIGhv4bq3YyB4IHF1w6EgbOG7m24pIHRow6wgCgkvLwkJICBjw6FjIGVtIGPDsyB0aOG7gyBuZ2jEqSDEkeG6v24gdmnhu4djIGTDuW5nIG1hcCAobWFwPGludCwgaW50PiBjbnQpICAKCglsbCBhbnMgPSAwOyAgCgkKCWZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgewoJCWFucyArPSBjbnRbcHJlZltpXV07ICAgCgkJY250W3ByZWZbaV1dKys7ICAgCgl9CQoKCWNvdXQgPDwgYW5zIDw8ICdcbic7ICAKCglyZXR1cm4gMDsgIAp9Cg==