hdu1465---全错位排列

有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;
}
发布了27 篇原创文章 · 获赞 0 · 访问量 336

猜你喜欢

转载自blog.csdn.net/weixin_44083561/article/details/104418488