VN_ZR_I - Số không (I)
Tác giả: flashmt
Ngôn ngữ: Pascal
var n,num,k:longint;
d:array[0..65] of byte;
c:array[0..32,0..32] of longint;
sl:array[0..32] of int64;
re:int64;
procedure init;
var i:longint;
begin
fillchar(d,sizeof(d),0);
i:=0;
while n>0 do
begin
d[i]:=n mod 2;
n:=n div 2;
inc(i);
end;
num:=i;
end;
procedure ini;
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 work(k:longint);
var i,num0,j:longint;
begin
fillchar(sl,sizeof(sl),0);
for i:=1 to num-1 do
for j:=1 to i-1 do
sl[j]:=sl[j]+c[i-1,j];
num0:=0;
for i:=num-2 downto 0 do
if d[i]=1 then
begin
for j:=0 to i do
sl[j+num0+1]:=sl[j+num0+1]+c[i,j];
end
else inc(num0);
num0:=0;
for i:=0 to num-1 do
if d[i]=0 then inc(num0);
inc(sl[num0]);
for i:=1 to 32 do
for j:=(i-1)*k+1 to i*k do
if j<=32 then
re:=re+sl[j]*i;
end;
begin
ini;
while not eof do
begin
readln(n,k);
if n=1 then
begin
writeln(0);
continue;
end;
init;
re:=0;
work(k);
writeln(re);
end;
end.