1 /*
   2 1465 不容易系列之一,递推求解
   3 ymc 2008/9/23
   4 题目大意:
   5 有n封信和n个信封,求所有的信都装错信封,共有多少种不同情况。
   6 分析与解题思路:
   7 称n封信与n个信封,所有信装错信封的个数为n错排数。
   8 设F[n]为n错排数,设
   9 a1,a2,,,.an为1,2,...n的一个错排。
  10 则找到n所在的数,假设为ai,交换ai与an,得到
  11 a1,a2,,an,..an-1,ai=n
  12 前面的n-1个数a1,a2,..an,..an-1有两种情况
  13 1)为n-1错排数,总共有F[n-1]种,
  14 2)an没有错排,剩下的n-2个数错排。则有F[n-2]种。
  15 又ai有n-1种可能。则
  16 F[n]=(F[n-1]+F[n-2])*(n-1)
  17 注意:用int会溢出
  18 */
  19 #include <iostream>
  20 using namespace std;
  21 const int N=21;
  22 long long  F[N];
  23 void Init()
  24 {
  25     F[1]=0;
  26     F[2]=1;
  27     for(int i=3;i<N;i++)
  28         F[i]=(F[i-1]+F[i-2])*(i-1);
  29 }
  30 int main()
  31 {
  32     int n;
  33     Init();
  34     while(cin>>n)
  35     {
  36         cout<<F[n]<<endl;
  37     }
  38 }
ch3n2k.com | Copyright (c) 2004-2020 czk.