#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 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]]--;
// number of subarrays ending here with sum mod k 0 = number of prefixes we can
// remove with sum mod k = pre[i]
ans += mp[pre[i]];
mp[pre[i]]++;
}
return ans;
}
int main() {
ll k = 4;
vector<ll> pids{1,3,2,4};
cout << f(pids, k) << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmxsIGYodmVjdG9yPGxsPiYgcGlkcywgbGwgaykgewoJaWYgKGsgPT0gMSkgcmV0dXJuIDA7CgkgCglpbnQgbiA9IHBpZHMuc2l6ZSgpOwogICAgLy8gc3VidHJhY3QgMQogICAgZm9yIChsbCYgcGlkIDogcGlkcykgewogICAgICAgIHBpZCA9IChwaWQgJSBrIC0gMSArIGspICUgazsKICAgIH0KICAgIAogICAgdmVjdG9yPGxsPiBwcmUobik7CiAgICBwcmVbMF0gPSBwaWRzWzBdOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyArK2kpIHsKICAgIAlwcmVbaV0gKz0gcHJlW2kgLSAxXSArIHBpZHNbaV07CiAgICAJcHJlW2ldICU9IGs7CiAgICB9CiAgICAKICAgIC8vIGNvdW50IHN1YmFycmF5cyB3aG9zZSBzdW0gbW9kIGsgPSAwCiAgICBtYXA8bGwsIGxsPiBtcDsgLy8gbXBbaV0gPSBob3cgcHJlZml4ZXMgaGF2ZSBzdW0gbW9kIGsgPSBpCiAgICBtcFswXSA9IDE7IC8vIHJlcHJlc2VudHMgZW1wdHkgcHJlZml4CiAgICBsbCBhbnMgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIAkvLyByZW1vdmUgcHJlZml4ZXMgdGhhdCBsZWF2ZSBzdWZmaXggbGVuID49IGsKICAgIAlpZiAoaSA9PSBrIC0gMSkgbXBbMF0tLTsKICAgIAlpZiAoaSA+PSBrKSBtcFtwcmVbaS1rXV0tLTsKCiAgICAgICAgLy8gbnVtYmVyIG9mIHN1YmFycmF5cyBlbmRpbmcgaGVyZSB3aXRoIHN1bSBtb2QgayAwID0gbnVtYmVyIG9mIHByZWZpeGVzIHdlIGNhbgogICAgICAgIC8vIHJlbW92ZSB3aXRoIHN1bSBtb2QgayA9IHByZVtpXQogICAgICAgIGFucyArPSBtcFtwcmVbaV1dOwogICAgICAgIG1wW3ByZVtpXV0rKzsKICAgICAgICAKICAgIH0KICAgIAogICAgcmV0dXJuIGFuczsKICAgIAp9CgppbnQgbWFpbigpIHsKCWxsIGsgPSA0OwogICAgdmVjdG9yPGxsPiBwaWRzezEsMywyLDR9OwoKICAgIGNvdXQgPDwgZihwaWRzLCBrKSA8PCAnXG4nOwogICAgCiAgICByZXR1cm4gMDsKfQ==