是去年NOI的第二题
我参加了
源程序还在(我参加的是Pascal组)program No2(input,output,fi,fo);
var
fi,fo:text;
i:integer;
n,k:integer;
Count:integer;
NumItem:array[1..6]of integer;
Idx:integer;
t:integer;
f:boolean;begin
assign(fi,'input2.txt');
reset(fi);
readln(fi,n,k);
close(fi); for i:=2 to k do
NumItem[i]:=1;
NumItem[1]:=n-(k-1); Count:=1; {最初状态 1,1,……,n-(k-1)也算一种}
while NumItem[1]>=NumItem[2] do
begin
Idx:=2;
f:=true;
while f do
begin
{移动1}
dec(NumItem[Idx-1]);
inc(NumItem[Idx]);
if NumItem[Idx]>NumItem[Idx-1] then begin
{恢复1}
inc(NumItem[Idx-1]);
dec(NumItem[Idx]); inc(Idx); if Idx>k then
begin
f:=false;
NumItem[1]:=-maxint;
{writeln('Exit');}
end; end
else
begin
{for i:=1 to k do
begin
write(NumItem[k-i+1]:3);
end;
writeln;} f:=false;
inc(Count); end; end; end; assign(fo,'out2.txt');
rewrite(fo);
writeln(fo,Count);
close(fo);end.
我参加了
源程序还在(我参加的是Pascal组)program No2(input,output,fi,fo);
var
fi,fo:text;
i:integer;
n,k:integer;
Count:integer;
NumItem:array[1..6]of integer;
Idx:integer;
t:integer;
f:boolean;begin
assign(fi,'input2.txt');
reset(fi);
readln(fi,n,k);
close(fi); for i:=2 to k do
NumItem[i]:=1;
NumItem[1]:=n-(k-1); Count:=1; {最初状态 1,1,……,n-(k-1)也算一种}
while NumItem[1]>=NumItem[2] do
begin
Idx:=2;
f:=true;
while f do
begin
{移动1}
dec(NumItem[Idx-1]);
inc(NumItem[Idx]);
if NumItem[Idx]>NumItem[Idx-1] then begin
{恢复1}
inc(NumItem[Idx-1]);
dec(NumItem[Idx]); inc(Idx); if Idx>k then
begin
f:=false;
NumItem[1]:=-maxint;
{writeln('Exit');}
end; end
else
begin
{for i:=1 to k do
begin
write(NumItem[k-i+1]:3);
end;
writeln;} f:=false;
inc(Count); end; end; end; assign(fo,'out2.txt');
rewrite(fo);
writeln(fo,Count);
close(fo);end.
我是推出了数学规律才做的