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.

Download