n封信错排问题


//把n封信都装错了:
//1.前n-1封信都已经装错了,然后从n-1封信中取出一封信,放到第n个信封中,再将原来第n个信封中的信放到刚刚被取出的信封的信封中。
//2.前n-1封信,恰有一封信装对了,将装对了的这封信放到第n个信封中,再将原来第n个信封中的信放到刚刚被取出的信的信封中。
//递推式:f(n)=(n-1)*f(n-1)+(n-1)*f(n-2)=(n-1)*(f(n-1)+f(n-2))
//初始值:f(1)=0,f(2)=1
#include
using namespace std;
#define int long long
signed main()
{
    int a[100];
    a[1] = 0, a[2] = 1;
    int i, n;
    cin >> n;
    for (i = 3; i <= n; i++)
        a[i] = (i - 1) * (a[i - 1] + a[i - 2]);
    for (i = 1; i <= n; i++)
        cout << a[i] << ' ';
    return 0;
}

你可能感兴趣的:(数据结构与算法,c++,算法)