Pagini recente » Cod sursa (job #159462) | Cod sursa (job #1427452) | Cod sursa (job #641968) | Cod sursa (job #228359) | Cod sursa (job #72730)
Cod sursa(job #72730)
#include <stdio.h>
#include <stdlib.h>
#define max 500000
typedef struct pnod{ int poz; pnod *next; } pnod;
int a[max],n, aa,bb,k;
long 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];
}
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);
}
long int calc(int lung)
{
pnod *p1, *p2;
long 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();
long int rez,r1,r2;
r1=calc(bb);
if (aa > 2)
r2=calc(aa-1);
else r2=0;
rez = r1-r2;
freopen("divk.out","w", stdout);
printf("%lld", rez);
fclose(stdout);
}