LEM6 - BIRTHDAY
Tác giả: flashmt
Ngôn ngữ: Pascal
const base=10000;
type bignum=array[0..1000] of longint;
var n,m,sum:longint;
re:bignum; kt:boolean;
procedure rf;
var i,t:longint;
begin
readln(m,n);
sum:=0;
for i:=1 to n do
begin
read(t);
sum:=sum+t;
end;
kt:=true;
end;
procedure multi(var re:bignum;b:longint);
var mem,i,t:longint;
begin
mem:=0;
for i:=1 to re[0] do
begin
t:=re[i]*b+mem;
re[i]:=t mod base;
mem:=t div base;
end;
if mem>0 then
begin
inc(re[0]);
re[re[0]]:=mem;
end;
end;
procedure divide(var re:bignum;b:longint);
var mem,i,j:longint;
t:bignum;
begin
mem:=0;
fillchar(t,sizeof(t),0);
for i:=re[0] downto 1 do
begin
j:=re[i]+mem*base;
if j<b then
begin
t[i]:=0;
mem:=j;
end
else
begin
t[i]:=j div b;
mem:=j mod b;
end;
end;
for i:=re[0] downto 1 do
if t[i]>0 then break;
re[0]:=i;
for i:=re[0] downto 1 do
re[i]:=t[i];
end;
procedure pr;
var i,k,p,j:longint;
begin
k:=m-(sum+n-1);
if k<0 then
begin
kt:=false;
exit;
end;
p:=n+k;
if k>n then k:=n;
re[0]:=1; re[1]:=1;
for i:=1 to k do
begin
multi(re,p-i+1);
divide(re,i);
end;
end;
procedure wf;
var i,j,l:longint; s:string;
begin
if not kt then write(0)
else
for i:=re[0] downto 1 do
begin
if i<re[0] then
begin
str(re[i],s);
l:=length(s);
for j:=l+1 to 4 do write(0);
end;
write(re[i]);
end;
end;
begin
rf;
pr;
wf;
end.