思路:
1.第一个人装错有 n - 1中装法;
2.第二个人装错,若第二个人选第一封信的位置装,那么相当于剩下的n - 2个人进行错排; 如果第二个人没有选第一个位置,相当于剩下的n - 1个位置进行错排;
3.得到递推式:(n - 1) * (f[n - 1] + f[n - 2])
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 25;
int d[N];
void init()
{
//信封错排
d[1] = 0, d[2] = 1, d[3] = 2;
for(int i = 4; i <= N; i++)
d[i] = (i - 1) * (d[i - 1] + d[i - 2]);
}
void solve()
{
int n;
cin >> n;
cout << d[n] << endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0); cout.tie(0);
init();
int T = 1;
while(T--)solve();
return 0;
}
这里是空的这里是空的这里是空的这里是空的
这里是空的这里是空的这里是空的这里是空的
这里是空的这里是空的这里是空的这里是空的
这里是空的这里是空的这里是空的这里是空的
这里是空的这里是空的这里是空的这里是空的
这里是空的这里是空的这里是空的这里是空的
这里是空的这里是空的这里是空的这里是空的