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.