Pagini recente » Cod sursa (job #554717) | Cod sursa (job #1099665) | Cod sursa (job #2392838) | Cod sursa (job #817982) | Cod sursa (job #65685)
Cod sursa(job #65685)
#include <stdio.h>
#include <stdlib.h>
#define filein "divk.in"
#define fileout "divk.out"
#define NMax 500000
#define KMax 100000
typedef long long vector[NMax + 1];
typedef struct {
int id;
struct lista *next;
} lista;
int n, k, a, b;
vector v;
lista *T[KMax+ 1];
long long C[2];
void citire()
{
FILE *fin = fopen(filein, "r");
int i, x;
fscanf(fin, "%d %d %d %d", &n, &k, &a, &b);
for (v[0] = 0, i = 1; i <= n; i++)
{
fscanf(fin, "%d", &x);
v[i] = v[i-1] + x;
}
fclose(fin);
}
void add_to_list(lista **l, int pozitie)
{
lista *tmp = (lista *)malloc(sizeof(lista));
tmp->id = pozitie;
tmp->next = *l;
*l = tmp;
}
void compute(int MAX, int tip)
{
int i, p1, p2;
lista *f, *g;
C[tip] = 0;
for (i = 0; i < k; i++)
{
p1 = p2 = 0;
for (f = T[i], g = T[i]; f; f = f->next, p2++)
{
while (f->id - g->id > MAX)
g = g->next, p1++;
if (f->id > g->id)
C[tip] += p2 - p1;
}
}
}
void solve()
{
int i;
for (i = 0; i < k; i++) T[i] = NULL;
for (i = n; i >= 0; i--) add_to_list(&T[v[i] % k], i);
compute(b, 1);
compute(a-1, 0);
}
void print()
{
FILE *fout = fopen(fileout, "w");
fprintf(fout, "%lld\n", C[1]-C[0]);
fclose(fout);
}
int main()
{
citire();
solve();
print();
return 0;
}