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.

Download