#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll f(vector<ll>& pids, ll k) {
if (k == 1) return 0;
int n = pids.size();
// subtract 1
for (ll& pid : pids) {
pid = (pid % k - 1 + k) % k;
}
vector<ll> pre(n);
pre[0] = pids[0];
for (int i = 1; i < n; ++i) {
pre[i] += pre[i - 1] + pids[i];
pre[i] %= k;
}
// count subarrays whose sum mod k = 0
map<ll, ll> mp; // mp[i] = how prefixes have sum mod k = i
mp[0] = 1; // represents empty prefix
ll sum = 0, ans = 0;
for (int i = 0; i < n; ++i) {
// remove prefixes that leave suffix len >= k
if (i == k - 1) mp[0]--;
if (i >= k) mp[pre[i-k]]--;
ll pid = pids[i];
sum = (sum + pid) % k;
// number of subarrays ending here with sum mod k 0 = number of prefixes we can
// remove with sum mod k = sum
ans += mp[sum];
mp[sum]++;
}
return ans;
}
int main() {
ll k = 4;
vector<ll> pids{1,3,2,4};
cout << f(pids, k) << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmxsIGYodmVjdG9yPGxsPiYgcGlkcywgbGwgaykgewoJaWYgKGsgPT0gMSkgcmV0dXJuIDA7CgkgCglpbnQgbiA9IHBpZHMuc2l6ZSgpOwogICAgLy8gc3VidHJhY3QgMQogICAgZm9yIChsbCYgcGlkIDogcGlkcykgewogICAgICAgIHBpZCA9IChwaWQgJSBrIC0gMSArIGspICUgazsKICAgIH0KICAgIAogICAgdmVjdG9yPGxsPiBwcmUobik7CiAgICBwcmVbMF0gPSBwaWRzWzBdOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyArK2kpIHsKICAgIAlwcmVbaV0gKz0gcHJlW2kgLSAxXSArIHBpZHNbaV07CiAgICAJcHJlW2ldICU9IGs7CiAgICB9CiAgICAKICAgIC8vIGNvdW50IHN1YmFycmF5cyB3aG9zZSBzdW0gbW9kIGsgPSAwCiAgICBtYXA8bGwsIGxsPiBtcDsgLy8gbXBbaV0gPSBob3cgcHJlZml4ZXMgaGF2ZSBzdW0gbW9kIGsgPSBpCiAgICBtcFswXSA9IDE7IC8vIHJlcHJlc2VudHMgZW1wdHkgcHJlZml4CiAgICBsbCBzdW0gPSAwLCBhbnMgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIAkvLyByZW1vdmUgcHJlZml4ZXMgdGhhdCBsZWF2ZSBzdWZmaXggbGVuID49IGsKICAgIAlpZiAoaSA9PSBrIC0gMSkgbXBbMF0tLTsKICAgIAlpZiAoaSA+PSBrKSBtcFtwcmVbaS1rXV0tLTsKICAgIAkKICAgIAlsbCBwaWQgPSBwaWRzW2ldOwogICAgICAgIHN1bSA9IChzdW0gKyBwaWQpICUgazsKICAgIAkKICAgICAgICAvLyBudW1iZXIgb2Ygc3ViYXJyYXlzIGVuZGluZyBoZXJlIHdpdGggc3VtIG1vZCBrIDAgPSBudW1iZXIgb2YgcHJlZml4ZXMgd2UgY2FuCiAgICAgICAgLy8gcmVtb3ZlIHdpdGggc3VtIG1vZCBrID0gc3VtCiAgICAgICAgYW5zICs9IG1wW3N1bV07CiAgICAgICAgbXBbc3VtXSsrOwogICAgICAgIAogICAgfQogICAgCiAgICByZXR1cm4gYW5zOwogICAgCn0KCmludCBtYWluKCkgewoJbGwgayA9IDQ7CiAgICB2ZWN0b3I8bGw+IHBpZHN7MSwzLDIsNH07CgogICAgY291dCA8PCBmKHBpZHMsIGspIDw8ICdcbic7CiAgICAKICAgIHJldHVybiAwOwp9