标签:
原题;
Description
Input
Output
Sample Input
Sample Output
1、当N=1和2时,易得解~,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:
2、当有N封信的时候,前面N-1封信可以有N-1或者 N-2封错装
3、前者,对于每种错装,可从N-1封信中任意取一封和第N封错装,故=F(N-1)*(N-1)
4、后者简单,只能是没装错的那封和第N封交换信封,没装错的那封可以是前面N-1封中的任意一个,故等于 F(N-2) * (N-1)
代码很短,关键是错排思想
代码:
#include <stdio.h> #include <string.h> #include<iostream> using namespace std; int main() { int n, i; __int64 a[25]; a[2] = 1; a[3] = 2; for (i = 4; i <= 21; i++) a[i] = (i - 1)*(a[i - 1] + a[i - 2]); while (scanf("%d", &n) != EOF) printf("%lld\n", a[n]); return 0; }
标签:
原文地址:http://www.cnblogs.com/shawn-ji/p/4748924.html