Cod sursa(job #30991)

Utilizator therain3rVlad Dumitrescu therain3r Data 15 martie 2007 13:14:59
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
# include <stdio.h>
# include <stdlib.h>

typedef struct NOD {long int poz; NOD *next;};

const long int MAXR=100100; ///AICI!!!! 100100
long int n,k,a,b;

NOD *prim[MAXR], *ultim[MAXR];

void add(long int r, long int poz)
{
NOD *p;
p=(NOD*) malloc (sizeof(NOD));
(*p).poz=poz;(*p).next=NULL;
if (prim[r]==NULL)
	{
	prim[r]=p;
	ultim[r]=p;
	}
else
	{
	(*ultim[r]).next=p;
	ultim[r]=(*ultim[r]).next;
	}
}

void citire()
{
FILE *f=fopen("divk.in","r");
fscanf(f,"%ld%ld%ld%ld",&n,&k,&a,&b);
long int sum=0,i,x;
for (i=1;i<=n;i++)
	{
	fscanf(f,"%ld",&x);
	sum+=x;
	sum%=k;
	add(sum,i);
	}
fclose(f);
}

long long int solutie(long int max)
{
long long int sol=0;
long int i,dif;
NOD *p1,*p2;
for (i=0;i<=k-1;i++)
	if (prim[i]&&(*prim[i]).next)
		{
		p1=prim[i];
		p2=(*p1).next;
		dif=1;
		while (p2)
			{
			while ((*p2).poz-(*p1).poz>max)
				{
				p1=(*p1).next;
				dif--;
				}
			sol+=dif;
			p2=(*p2).next;
			dif++;
			}
		}
p1=prim[0];
while (p1&&(*p1).poz<=max)
	{
	sol++;
	p1=(*p1).next;
	}
return sol;
}

void scrie()
{
FILE *g=fopen("divk.out","w");
fprintf(g,"%lld\n",solutie(b)-solutie(a-1));
fcloseall();
}

int main()
{
citire();
scrie();
return 0;
}