思路:分解问题为组合和错排。
#include<stdio.h>
__int64 nn(int n)
{
__int64 s = 1;
int i;
for(i = 1;i <= n; i++)
s *= i;
return s;
}
int main()
{
__int64 a[22];
a[0] = 0;
a[1] = 0;
a[2] = 1;
a[3] = 2;
int i;
for(i = 4;i < 22; i++)
a[i] = (i-1)*(a[i-1] + a[i-2]);
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
printf("%I64d\n",nn(n)/(nn(n-m)*nn(m))*a[m]);
}
return 0;
}