var
n,k,i,j,ans:longint;
h:array[1..100] of longint;
map:array[0..101,0..101] of boolean;
procedure dfs(step,num:longint);
var
i,j,mark:longint;
begin
if num>k then exit;
if n-step<k-num then exit;
if step=n then
begin
if num=k then inc(ans);
exit;
end;
dfs(step+1,num);
for i:=1 to h[step+1] do
begin
if map[step+1,i]=true then
begin
mark:=step+1;
while map[mark,i]=true do
begin
map[mark,i]:=false;
inc(mark);
end;
dec(mark);
dfs(step+1,num+1);
for j:=step+1 to mark do
map[j,i]:=true;
end;
end;
end;
begin
assign(input,'boarda.in'); reset(input);
assign(output,'boarda.out'); rewrite(output);
readln(n,k);
for i:=1 to n do
begin
read(h[i]);
for j:=1 to h[i] do
map[i,j]:=true;
end;
dfs(0,0);
writeln(ans);
close(input); close(output);
end.