Cod sursa(job #85355)

Utilizator andrei.12Andrei Parvu andrei.12 Data 21 septembrie 2007 09:10:42
Problema Divk Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<stdio.h>
int n, k, a, b, i, p1, j, s, s1, s2, cit, v[100000];
int (*de)[1000] = new int [100000][1000];
int gs(int b){
	int s1 = 0;
	for (i=0; i<k; i++){
		p1 = 1;
		for (j=2; j<=v[i]; j++)
			if (de[i][j]-de[i][p1] > b){
				p1 ++;
				if (j-p1-1 > 0)
					s1 += j-p1-1;
				while (de[i][j]-de[i][p1] > b && p1+1 < j){
					p1 ++;
					s1 += j-1-p1;
				}
				if (de[i][j]-de[i][p1] <= b && p1 < j)
					s1 ++;
			}
			else
				s1 ++;
		for (j=p1+1; j<v[i]; j++)
			s1 += v[i]-j;
	}
	return s1;
}
int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	scanf("%d%d%d%d", &n, &k, &a, &b);
	v[0] = 1;
	for (i=1; i<=n; i++){
		scanf("%d", &cit);
		s += cit;
		de[s % k][++v[s % k]] = i;
	}
	s1 = gs(b);
	s2 = gs(a-1);
	if (s1 - s2 < 0)
		s1 = s2;
	printf("%d\n", s1-s2);
	fclose(stdin);
	fclose(stdout);
	return 0;
}