N对新婚夫妇,M对找错,其实就是现在N里面选出M,也就是C(N,M),然后考虑M对夫妇,全都选不到自己的配偶的情况(错排):
M[i]=(n-1)(M[i-1]+M[i-2])
推理如下:
假设A B C D 四个人
假设A先选错,那他有3种选择(即n-1种)
A B C D
* A * *
如果B也选择了A,那么问题转化成 n-2规模的
如果B不选择A,那么转化成n-1规模的(因为B不选A,可以将A看成A')
/*HDOJ2049
作者:陈佳润
2013-04-08
*/
#include<iostream>
using namespace std;
int c(int n,int k){
int i,sum=1,kk;
kk=2;
for(i=1;i<=k;i++){
sum*=n;
n--;
while(sum%kk==0&&kk<=k){
sum/=kk;
kk++;
}
}
return sum;
}
int main()
{
int i,t,a,b;
__int64 num[21];
num[0]=1;
num[1]=0;num[2]=1;
for(i=2;i<=20;i++)
num[i]=(i-1)*(num[i-1]+num[i-2]);
cin>>t;
while(t--){
cin>>a>>b;
printf("%I64d\n",c(a,b)*num[b]);
}
return 0;
}