HDU2049不容易系列之(4)——考新郎(错排)

题目在这里:传送门
分析:错排公式入门题,公式和这个例题其实在这一篇blog中我有提过,了解公式可以看一下
思路:M个新郎找错新娘(太惨了吧)这个情况即为错排,然后一共又有N对新婚夫妇,所以从N个里面找M个是排列组合的C(N,M),由于阶乘数过大,所以就额外先码好了,以免计算时超时
AC代码

#include<iostream>
using namespace std;
long long _cuopai[10000]={0};
long long jiecheng[22]={1,1,2,6,24,120,720,5040,40320,
					    362880,3628800,39916800,479001600,
						6227020800,87178291200,1307674368000,
						20922789888000,355687428096000,6402373705728000,
						121645100408832000,2432902008176640000};
long long cuopai(int x){
	if(_cuopai[x])	return _cuopai[x];
	if(x==1)	return 0;
	if(x==2)	return 1;
	return _cuopai[x]=(x-1)*(cuopai(x-1)+cuopai(x-2));
}
long long j(int x,int y){
	return jiecheng[x]/(jiecheng[y]*jiecheng[x-y]);
}
int main(){
		int c,n,m;
		cin>>c;
		while(c--){
			cin>>n>>m;
			cout<<(j(n,m)*cuopai(m))<<endl;
		}
} 

猜你喜欢

转载自blog.csdn.net/weixin_43556295/article/details/86684975