Pagini recente » Cod sursa (job #2527582) | Cod sursa (job #24572) | Cod sursa (job #2934854) | Cod sursa (job #2126112) | Cod sursa (job #72739)
Cod sursa(job #72739)
#include <stdio.h>
#include <stdlib.h>
#define max 500000
typedef struct pnod{ int poz; pnod *next; } pnod;
int a[max],n, aa,bb,k;
int s[max];
pnod *v[100000];
void citire()
{
pnod *p;
freopen("divk.in", "r", stdin);
scanf("%d %d %d %d\n", &n, &k, &aa, &bb);
for (int i = 1; i<=n ; i++)
{
scanf("%d\n",&a[i]);
s[i] = s[i-1] + a[i];
}
p=new pnod;
p->poz = 0;
p->next = v[0];
v[0] = p;
for (int i = n; i>0; i--)
{
p=new pnod;
p->poz = i;
p->next = v[s[i] % k];
v[s[i] % k] = p;
}
fclose(stdin);
}
int calc(int lung)
{
pnod *p1, *p2;
int nr = 0, rez=0;
int dif;
for (int i = 0; i<k; i++, nr=0)
{
p1 = v[i];
if (p1 == NULL ) continue;
p2 = p1;
dif = 0;
while (p2->next != NULL )
{
p2 = p2->next;
dif++;
while ( p2->poz - p1->poz + 1 >= lung )
{
p1 = p1->next;
dif--;
}
nr += dif;
}
rez +=nr;
}
return rez;
}
int main()
{
citire();
int rez,r1,r2;
r1=calc(bb);
//if (aa > 2)
r2=calc(aa);
//else r2=0;
rez = r1-r2;
freopen("divk.out","w", stdout);
printf("%d", rez);
fclose(stdout);
}