7-7 三国佚事——巴蜀之危 (20 分)
话说天下大势,分久必合,合久必分。。。却道那魏蜀吴三国鼎力之时,多少英雄豪杰以热血谱写那千古之绝唱。古人诚不我欺,确是应了那句“一将功成万骨枯”。
是夜,明月高悬。诸葛丞相轻摇羽扇,一脸愁苦。原来是日前蜀国战事吃紧,丞相彻夜未眠,奋笔急书,于每个烽火台写下安排书信。可想,这战事多变,丞相运筹 帷幄,给诸多烽火台定下不同计策,却也实属不易。
谁成想这送信小厮竟投靠曹操,给诸葛丞相暗中使坏。这小厮将每封书信都投错了烽火台,居然没有一封是对的。不多时小厮便被抓住,前后之事却也明朗。这可急坏了诸葛丞相,这书信传错,势必会让蜀军自乱阵脚,不攻自破啊!
诸葛丞相现在想知道被这小厮一乱,这书信传错共有多少种情况。
输入格式:
输入一个正数n,代表丞相共写了n(1 <= n <= 20)封书信。
输出格式:
输出书信传错的情况数。
输入样例:
3
输出样例:
2
这里普及一下错排的知识,就是每个都找错的情景,假设n本书错排数量是:错排(n)
假设有1~n个书包,每个书包里有着属于自己的书本,如果要将n个书本全部放错,有两种情况,先假设第k本书错放在第m个书包里,这有n-1种情况(比较好理解,就是从不是m的余下几本书里任意找一本)
1、此时如果我们将第m本书放在第k个书包里,就在此时,我们要在此错排余下的n-2个书包,这是不影响这n-2个错排的,因为第k本书占了第m个书包,第m本书占了第k个书包,因此这种情况是(n-1)*错排(n-2)
2、此时如果我们将第m本书不放在第k个书包里,很意外的是就在此时,我们找到了一个条件就是我们不允许第m本书放在第k个书包里,此时,我们已经踢出一个书包和一本书,就和n-1个错排的情况是一样的,即使第m本书和k个书包无关,但在我们讨论的条件下,是不允许这种情况发生,因此,非常类似于n-1个错排,因此这种情况是(n-1)*错排(n-1)
#include<stdio.h>
int main()
{
int n,i;
long long int a[60];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if(i==1)
a[i]=0;
else if(i==2)
a[i]=1;
else
a[i]=(i-1)*(a[i-1]+a[i-2]);
}
printf("%lld",a[n]);
}
这里对自己的讲解还是感觉非常有味道的,所以直接上代码