Pagini recente » Cod sursa (job #365799) | Cod sursa (job #982406) | Cod sursa (job #942729) | Cod sursa (job #451833) | Cod sursa (job #85688)
Cod sursa(job #85688)
#include<stdio.h>
int n, k, a, b, i, p1, j, s, s1, s2, cit, v[100000], kk[500005], de[500005], r, w[100000], st;
int gs(int b){
int s1 = 0, i = 1;
st = 1;
p1 = 0;
r = 0;
while (i <= n){
for (i=st; i<=v[r]; i++)
if (de[i]-de[p1] > b){
p1 ++;
if (i-p1-1 > 0)
s1 += i-p1-1;
while (de[i]-de[p1] > b && p1+1 < i){
p1 ++;
s1 += i-1-p1;
}
if (de[i]-de[p1] <= b && p1 < i)
s1 ++;
}
else
s1 ++;
for (j=p1+1; j<v[r]; j++)
s1 += v[r]-j;
p1 = v[r]+1;
st = v[r]+2;
r ++;
}
return s1;
}
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
scanf("%d%d%d%d", &n, &k, &a, &b);
for (i=1; i<=n; i++){
scanf("%d", &kk[i]);
s += kk[i];
v[s % k] ++;
}
w[0] = 1;
for (i=0; i<k; i++){
v[i] += v[i-1];
if (i > 0)
w[i] = v[i-1]+1;
}
s = 0;
for (i=1; i<=n; i++){
s += kk[i];
r = s % k;
de[w[r]] = i;
w[r] ++;
}
s1 = gs(b);
s2 = gs(a-1);
if (s1 - s2 < 0)
s1 = s2;
printf("%d\n", s1-s2);
fclose(stdin);
fclose(stdout);
return 0;
}