BINARY - Số nhị phân có nghĩa

Tác giả: flashmt

Ngôn ngữ: Pascal

var n,num,re,k:longint;
    d:array[0..65] of byte;
    c:array[0..32,0..32] of longint;

procedure rf;
var i,t:longint;
begin
     readln(n,k);
     fillchar(d,sizeof(d),0);
     i:=0;
     t:=n;
     while n>0 do
     begin
          if n mod 2 = 1 then d[i]:=1;
          n:=n div 2;
          inc(i);
     end;
     n:=t;
     num:=i;
end;

procedure init;
var i,j:longint;
begin
     fillchar(c,sizeof(c),0);
     c[0,0]:=1;
     for i:=1 to 32 do
     begin
          c[i,0]:=1;
          c[i,i]:=1;
          for j:=1 to i-1 do
              c[i,j]:=c[i-1,j]+c[i-1,j-1];
     end;
end;

procedure pr;
var i,num0:longint;
begin
     if (k=1) or (k=0) then re:=1 else re:=0;
     if n=1 then exit;
     {So chu so < n}
     for i:=2 to num-1 do
         if k<=i-1 then re:=re+c[i-1,k];
     {So chu so = n}
     num0:=0;
     for i:=num-2 downto 0 do
         if d[i]=1 then
         begin
              if k-num0-1<=i then
                 re:=re+c[i,k-num0-1];
         end
         else
         begin
              inc(num0);
              if num0>k then break;
         end;
     num0:=0;
     for i:=0 to num-1 do num0:=num0+d[i];
     if num0+k=num then inc(re);
end;

begin
     init;
     while not eof do
     begin
          rf;
          pr;
          writeln(re);
     end;
end.

Download