MIXUP2 - Đàn bò hỗn loạn
Tác giả: flashmt
Ngôn ngữ: Pascal
const fi='';
fo='';
maxc=65535;
maxn=15;
var n,k:longint;
re:int64;
a:array[0..maxn] of longint;
f:array[0..maxc,0..maxn] of int64;
p:array[0..maxn] of longint;
procedure rf;
var i:longint;
begin
assign(input,fi);
reset(input);
read(n,k);
dec(n);
for i:=0 to n do read(a[i]);
close(input);
end;
procedure init;
var i:longint;
begin
p[0]:=1;
for i:=1 to n+1 do p[i]:=p[i-1]*2;
end;
function out(j,i:longint):boolean;
begin
out:=((i shr j) and 1)=0;
end;
procedure pr;
var i,j,max,q:longint;
begin
init;
fillchar(f,sizeof(f),0);
for i:=0 to 15 do f[p[i],i]:=1;
max:=p[n+1]-1;
for i:=1 to max do
for j:=0 to n do
if not out(j,i) then
for q:=0 to n do
if out(q,i) and (abs(a[q]-a[j])>k) then
f[i or p[q],q]:=f[i or p[q],q]+f[i,j];
re:=0;
for i:=0 to n do
re:=re+f[max,i];
end;
procedure wf;
begin
assign(output,fo);
rewrite(output);
write(re);
close(output);
end;
begin
rf;
pr;
wf;
end.