Pagini recente » Cod sursa (job #1452923) | Cod sursa (job #1430781) | Cod sursa (job #2486865) | Cod sursa (job #3288621) | Cod sursa (job #30741)
Cod sursa(job #30741)
# include <stdio.h>
# include <alloc.h>
typedef struct NOD {int poz;NOD *next;};
const long int MAXR=100000;
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 int solutie(long int max)
{
long int i,dif;
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).poz<=max)
{
sol++;
p1=(*p1).next;
}
}
return sol;
}
void scrie()
{
FILE *g=fopen("divk.out","w");
fprintf(g,"%ld\n",solutie(b)-solutie(a-1));
fcloseall();
}
int main()
{
citire();
scrie();
return 0;
}