Pagini recente » Cod sursa (job #2978614) | Cod sursa (job #1660639) | summer_camp_2 | Cod sursa (job #2586912) | Cod sursa (job #30992)
Cod sursa(job #30992)
# 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;
}