!!!!!!!!!为什么 ????????
管理员,为什么会这样,测试数据为什么会这样?
program rqnoj8;
type
arr=array[0..200] of longint;
var
k,w,maxn,i,tmp:longint;
ans,b:arr;
procedure plus(a,b:arr;var c:arr); //高精度加法
var i:longint;
begin
fillchar(c,sizeof(c),0);
if a[0]>b[0] then
c[0]:=a[0]
else
c[0]:=b[0];
for i:=1 to c[0] do
begin
inc(c[i],a[i]+b[i]);
inc(c[i+1],c[i] div 1000);
c[i]:=c[i] mod 1000;
end;
if c[c[0]+1]<>0 then
inc(c[0]);
end;
procedure mul(a:arr;b:longint;var c:arr); //单精度乘法
var i:longint;
begin
fillchar(c,sizeof(c),0);
if b=0 then begin c[0]:=1;c[1]:=0;exit;end;
c[0]:=a[0];
for i:=1 to c[0] do
begin
inc(c[i],a[i]*b);
inc(c[i+1],c[i] div 1000);
c[i]:=c[i] mod 1000;
end;
while c[c[0]+1]<>0 do
begin
inc(c[0]);
inc(c[c[0]+1],c[c[0]] div 1000);
c[c[0]]:=c[c[0]] mod 1000;
end;
end;
procedure divi(a:arr;b:longint;var c:arr); //单精度除法
var i,tmp:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=a[0];tmp:=0;
for i:= c[0] downto 1 do
begin
tmp:=tmp*1000+a[i];
c[i]:=tmp div b;
tmp:=tmp mod b;
end;
while (c[0]>0)and(c[c[0]]=0) do dec(c[0]);
end;
procedure C(n,m:longint); //组合数
var i:longint;
begin
fillchar(b,sizeof(b),0);
b[0]:=1;b[1]:=1;
for i:=n downto n-m+1 do
mul(b,i,b);
for i:=2 to m do
divi(b,i,b);
end;
procedure print; //高精度的输出
var i:longint;
begin
write(ans[ans[0]]);
for i:=ans[0]-1 downto 1 do
if ans[i]<10 then
write('00',ans[i]) //ps:这里不能写成write(00,ans[i]),不然只输出一个0
else
if ans[i]<100 then
write('0',ans[i])
else
write(ans[i]);
writeln;
end;
begin
readln(k,w);
maxn:=1;
for i:=1 to k do
maxn:=2*maxn;
ans[0]:=0;
for i:=2 to w div k do //枚举2..(w div k)位的2^k进制数的个数
begin
C(maxn-1,i); //每进行一次过程C,就把组合数赋给b数组
plus(ans,b,ans);
end;
tmp:=1;
for i:=1 to w mod k do
tmp:=tmp*2;
dec(tmp);
for i:=1 to tmp do //step1:统计w div k+1位的2^k进制数的个数
begin
C(maxn-1-i,w div k+1-1);
plus(ans,b,ans);
end;
print;
end.