利用数学的错排公式
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 3005;
ll f[25];
int main() {
int n, m;
f[2] = 1, f[3] = 2;
for(int i = 4; i <= 20; ++i) {
f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
}
while(~scanf("%d %d", &n, &m)) {
ll a = 1, b = 1;
for(int i = 1, j = n; i <= m; ++i, --j) {
a *= i;
b *= j;
}
printf("%lld\n", b / a * f[m]);
}
return 0;
}