#include <iostream>
#include <cstdio>
using namespace std;
long long arrange(int n, int m) ///此题就是组合问题,复习了一下排列组合公式
{
long long outcome = 1;
long long outco = 1;
for(int i = 1; i <= m; ++i)
{
outcome *= n;
n--;
}
for(int i = 1; i <= m; ++i)
{
outco *= i;
}
return outcome / outco;
}
int main()
{
long long arry[25] = {0, 0, 1};
for(int i = 3; i <= 20; i++)
{
arry[i] = (i-1) * (arry[i-2] + arry[i-1]);
}
int t;
scanf("%d", &t);
int n, m;
while(t--)
{
scanf("%d %d", &n, &m);
if(n <= 1 || m <= 1)
break;
long long outcome = arry[m] * arrange(n, m);
cout << outcome << endl;
}
return 0;
}
排列组合的公式还是很重要的
错排的递推公式:D[i] = (i-1) * (D[i-1] + D[i-2]) ,(其中D[1] = 0, D[2] = 1)
排列公式 : n!/(n-m)!
组合公式 : (n!/(n-m)!)/m!
(!为阶乘)