Pagini recente » Cod sursa (job #2041957) | Cod sursa (job #1864905) | Cod sursa (job #1795208) | Cod sursa (job #45230) | Cod sursa (job #614903)
Cod sursa(job #614903)
#include <cstdio>
#define NMAX 500000
#define KMAX 100001
int n, k, a, b;
//rest[i] = cate sume partiale intre start si i-a dau restul j la impartirea cu k
int rest[KMAX];
long long nr, sum[NMAX];
int main()
{
int i, x, start;
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", &x);
sum[i] = sum[i-1] + x;
}
start = 0;
for(i=a;i<=n;++i)
{
rest[sum[i-a]%k]++; //pozitia i-a poate intra in secventa
if(start < i-b) //pozitia minima de la care poate incepe secventa trebuie avansata
{
rest[sum[start]%k]--;
start++;
}
nr += rest[sum[i]%k];
}
printf("%d", nr);
return 0;
}