Pagini recente » Cod sursa (job #2587478) | Cod sursa (job #227407) | Cod sursa (job #1449687) | Cod sursa (job #1150315) | Cod sursa (job #208789)
Cod sursa(job #208789)
#include <stdio.h>
#include <math.h>
#define max 500001
long v[max];
long ss[max], ww[max],j;
long sel[max / 4];
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
long n, a, b, k, x, s = 0, rest = 0, i, w, q = 0;
long long sol = 0;
scanf("%ld %ld %ld %ld", &n, &k, &a, &b);
for (i = 1; i <= n; ++i) {
scanf("%ld", &x);
v[i] = x % k;
}
for (i = 1; i <= a - 1; ++i) {
s += v[i];
}
s %= k;
x = 0;
for (i = a; i <= b; ++i) {
x += v[i];
x %= k;
ss[i] = x;
++sel[x];
}
for (i = a - 1; i <= n - 1; ++i) {
long sss = s - rest;
while (sss < 0) {
sss += k;
}
w = k - sss;
if (w == k) {
w = 0;
}
if (sel[w] > 0) {
sol += sel[w];
}
--sel[ss[i + 1]];
if (i + b - a + 2 <= n) {
x += v[i + b - a + 2];
x %= k;
ss[i + b - a + 2] = x;
++sel[x];
}
rest += v[i + 1];
rest %= k;
s += v[i + 1];
s -= v[i - a + 2];
if (s < 0) {
s += k;
}
s %= k;
}
long rrr, rrq;
rrr = sol / 1000000;
rrq = sol % 1000000;
if (rrr > 0) {
printf("%ld%ld\n",rrr,rrq);
} else {
printf("%ld\n",rrq);
}
return 0;
}