题目地址
就是一个组合数公式的运用和错排公式的运用
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void) {
int C;
long long a[20 + 1] = {0};
a[2] = 1;
for(int i = 3; i <= 20; i++) {
a[i] = (a[i - 1] + a[i - 2]) * (i - 1);
}
while(scanf("%d", &C) != EOF) {
for(int i = 0; i < C; i++) {
int N, M;
scanf("%d %d", &N, &M);
long long up = 1;
long long down = 1;
for(int i = N; i >= M + 1; i--) {
up *= i;
//printf("%lld\n", up);
}
for(int i = N- M; i >= 1; i--) {
down *= i;
//printf("%lld\n", down);
}
long long result = up / down * a[M];
printf("%lld\n", result);
}
}
return 0;
}