有n封信:首先,第一个信封不能放第一个封信,可以放2,3,4,5…n有(n-1)种选择,假设放了第k封信;那么对于第k个信封,如果放了第一封信,之后就变成了(n-2)个信封的全错位排列,如果放的不是第1封信,就变成(n-1)个信封的全错位排列
/*
n个数的错位排列种数:
(n-1)*(n-1个和n-2个数的错位排列种数之和)
*/
#include <cstdio>
typedef long long ll;
ll ans[25];
void init(){
ans[2] = 1;ans[3] = 2;
for(int i = 4;i <= 20;i++){
ans[i] = (i-1)*(ans[i-1]+ans[i-2]);
}
}
int n;
int main(){
init();
while(~scanf("%d",&n)){
printf("%lld\n",ans[n]);
}
return 0;
}