题目在这里:传送门
分析:错排公式入门题,公式和这个例题其实在这一篇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;
}
}