猴子吃香蕉(monkey)

来源:百度知道 编辑:UC知道 时间:2024/05/14 17:21:14
有n只猴子,编号1到n。猴子得到一些香蕉,每只猴子拥有的香蕉数量也是1到n,并且任意两只猴子拥有的香蕉数量都不相同。
现在,所有猴子开始吃香蕉。编号是i的猴子决定要吃i只香蕉,1<=i<=n。如果它拥有的香蕉足够,那就最好;如果不够,先吃完自己的,然后它就要问饲养员要香蕉。总之要吃i只香蕉。
如果有某一只猴子吃完了自己的香蕉,而且正好够(不用问饲养员要),那么它会变得比较郁闷,所以我们不允许任何一只猴子出现这种情况。
问最终吃完香蕉后,可能出现多少种不同的情况。在两个方案中,只要存在一只猴子的两次情况不一样,这两个方案就是不同的。N<=50
输入:monkey.in
一个正整数n。

输出:monkey.out
情况总数。

样例
输入:
2
输出:
1

输入:
3
输出:
2
说明:
如果3只猴子依次拥有3、1、2只香蕉,那么1号猴子最后剩2只,2号猴子要了1只,3号猴子要了1只,这是一个方案。另一个方案是3只猴子依次拥有2、3、1只香蕉,那么1号猴子最后剩1只,2号猴子剩1只,3号猴子要了2只。
但如果3只猴子依次拥有2、1、3只香蕉,那么3号猴子会郁闷,不符合要求。

这题目怎么 做。。急求源程序。。。
pascal

错排公式:
f(n)=(f(n-1)+f(n-2))*(n-1)
f(1)=0,f(2)=1.
program liuke_cuopai;
var
i,k:longint;
a,b,c:qword;
begin
assign(input,'monkey.in');
assign(output,'monkey.out');
reset(input);
rewrite(output);
readln(k);
a:=0;
b:=1;
for i:=3 to k do
begin
c:=(a+b)*(i-1);
a:=b;
b:=c;
end;
if k=1 then writeln(a) else if k=2 then writeln(b) else
writeln(c);
close(input);
close(output);
end.

如果把猴子的个数看作\"n\"的话.则结果为\"(n-1)*(n-2)\"

不信?试试看!