1.知识点:递推
2.题意:n封书信,询问每封书信均送错的情况总数
3.递推关系方程:
a[1] = 0;
a[2] = 1;
if(i >= 3) a[i] = (i-1)*(a[i-1] + a[i-2])
4.难题分析:可以有n-1封信投错到第n个烽火台,当第n个烽火台对应的信正好与前面烽火台x(投错到第n个烽火台的信应投的烽火台)对应的信是互换关系时,即(n-1) * f(n-2)种情况;当第n个烽火台对应的信与前面烽火台x(投错到第n个烽火台的信应投的烽火台)对应的信并不是互换关系时,即(n-1) * f(n-1)种情况。 所以递推公式为f(n)=(n-1)*(f(n-1)+f(n-2))。
代码:
#include <stdio.h>
int main()
{
long long n, i, a[24];
while(scanf("%lld", &n) != EOF)
{
a[1] = 0;
a[2] = 1;
for(i = 3; i <= n; i++)
{
a[i] = (i-1)*(a[i-1] + a[i-2]);
}
printf("%lld\n", a[n]);
}
return 0;
}