Pagini recente » Cod sursa (job #645360) | Cod sursa (job #23292) | Cod sursa (job #1148758) | Cod sursa (job #2303502) | Cod sursa (job #72726)
Cod sursa(job #72726)
//infoarena divk
const max = 500000;
type plist = ^tlist;
tlist = record
x:longint;
next:plist;
end;
rr = record
head,last:plist;
end;
var a: array[1..max] of longint;
s: array[0..max] of int64;
v: array[0..100000] of rr;
n,aa,bb,k,rez:longint;
procedure add(lista,i:longint);
var p:plist;
begin
new(p); p^.x:=i; p^.next:=nil;
if v[lista].head = nil then
v[lista].head:=p
else v[lista].last^.next:=p;
v[lista].last:=p;
end;
procedure citire;
var i:longint;
begin
assign(input,'divk.in'); reset(input);readln(n,k,aa,bb);
//add(0,0);
for i:=1 to n do
begin
readln(a[i]);
s[i]:=s[i-1]+a[i];
add(s[i] mod k,i);
end;
close(input);
end;
{procedure calc;
var i,nr:longint;
p1,p2:plist;
begin
for i:=0 to k-1 do
begin
nr:=0;
p1:=v[i].head;
while p1 <> nil do
begin
p2:=p1^.next;
nr:=0;
while (p2 <> nil ) and (p2^.x-p1^.x <=bb) do
begin
if (p2^.x-p1^.x >=aa ) then
inc(nr);
p2:=p2^.next;
end;
rez:=rez+nr;
p1:=p1^.next;
end;
end;
end;}
function calc ( lung : longint ) : int64;
var p1,p2 : plist;
nr,dif, rez: int64;
i:longint;
begin
rez:=0;
for i:=0 to k-1 do
begin
nr:=0;
p1 := v[i].head;
if p1 = nil then continue;
p2 := p1^.next;
dif := 0;
while ( p2 <> nil ) do
begin
while (p2 <> nil) and (p2^.x - p1^.x +1 <=lung ) do
begin
inc(dif);
nr:=nr+dif;
p2:=p2^.next;
end;
p1:=p1^.next;
dif:=dif-1;
end;
rez:=rez+nr;
end;
calc:=rez;
end;
begin
citire;
//calc;
assign(output,'divk.out'); rewrite(output);
writeln(calc(bb)-calc(aa-1));
close(output);
end.