http://http://acm.hdu.edu.cn/showproblem.php?pid=1465
装错信封问题
这个问题是由 18 世纪初的法国数学家蒙摩提出来的。
瑞士数学家欧拉按一般情况给出了一个递推公式
A,B表示信,a,b表示信封,假设一共有n个信封,用f[n]记录n个信封装错的种数
首先针对其中的两个信封进行讨论
假设A装进了b,在这个大前提下
1、如果B装进了a,那么此时装错信封有f[ n-2 ]种
2、如果B没有装进a,那么此时装错信封就有f[ n-1 ]种
那么我们就能得出一个递推式
f[ n ] = (n-1)(f[ n-2 ]+f[ n-1 ])
#include <iostream>
using namespace std;
__int64 f[25];
void init()
{
f[2] = 1;
f[3] = 2;
for(int i=4;i<=20;i++)
{
f[i] = (i-1)*(f[i-1]+f[i-2]);
}
}
int main()
{
int n;
init();
while(cin>>n)
{
cout<<f[n]<<endl;
}
return 0;
}