这里说的考新郎不重复,如果按照自己的理解可以需要一定的时间,但是在数学上有一个公式,错排公式D(n)=(n-1)[D(n-2)+D(n-1)],这样子的话就容易理解很多。这里说的是M队中N队找错所以这并不是完全错排,有需要用到概率问题N!/M!/(N-M)!。这里可以采用空间换时间的方法。由于数据可能很大,我们要用long long int。上代码。
#include <iostream>
using namespace std;
int main()
{
int T,n,m,i;
long long int a[25],b[25],ans;
a[0] = 1,a[1] = 1,a[2] = 2;
for(i = 3;i<21;i++)
a[i] = a[i-1]*i;
b[2] = 1,b[3] = 2;
for(i = 4;i<21;i++)
b[i] = (i-1) *(b[i-1]+b[i-2]);
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d %d",&n,&m);
ans = a[n]/a[m]/a[n-m]*b[m];
printf("%lld\n",ans);
}
}
return 0;
}