杭电ACM2049


运用到了一个公式:(错排公式)
d[i]=(i-1)*(d[i-1]+d[i-2]);
那么问题这样就简单了: 

#include <stdio.h>
double hdacm(double all, double part) {
	double i,all_=1.0,part_=1.0,subtract_=1.0;
	for(i=1; i<=all; i++) all_*=i;
	for(i=1; i<=part; i++) part_*=i;
	for(i=1; i<=all-part; i++) subtract_*=i;
	return all_/part_/subtract_;}
int main(){
	int n,i,all_,part_;
	long long jg,sz[25] = {0, 0, 1, 2};
	for(i=4; i<21; i++) sz[i]=(i-1)*(sz[i-1]+sz[i-2]);
	while(~scanf("%d", &n)) {
		for(i=0; i<n; i++) {
			scanf("%d%d", &all_, &part_);
			jg=hdacm(all_, part_);
			printf("%I64d\n",jg*sz[part_]);}}
	return 0;}

猜你喜欢

转载自blog.csdn.net/qq_40728285/article/details/79933620