Cod sursa(job #65685)

Utilizator peanutzAndrei Homorodean peanutz Data 11 iunie 2007 15:25:31
Problema Divk Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#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;
}