Cod sursa(job #30754)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 14 martie 2007 23:41:53
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
# include <stdio.h>
# include <stdlib.h>

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

const long int MAXR=100010;

NOD *prim[MAXR+1];
NOD *ultim[MAXR+1];

long int n,k,a,b;

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

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

long long int solutie(long int max)
{
long int i,dif;
long long int sol=0;
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;
			}
		}
if (prim[0])
	{
	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;
}