题意
N中有多少中M个数的错排
思路
错排公式
f[0]=1, f[1] = 0, f[2]=1
f[n]=(n-1)*(f[n-1]+f[n-2])
代码
// hdu 2049
#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int INF = 0x7f7f7f7f;
const int maxn = 20;
ll C ( int n, int m ) {
ll sum1, sum2;
sum1 = sum2 = 1;
for ( int i = n; i > n - m; --i )
sum1 *= i;
for ( int i = 1; i <= m; ++i )
sum2 *= i;
return sum1 / sum2;
}
//错排公式
ll f[ maxn + 10 ];
void perm () {
f[ 1 ] = 0, f[ 2 ] = 1;
for ( int i = 3; i <= maxn; ++i )
f[ i ] = ( i - 1 ) * ( f[ i - 1 ] + f[ i - 2 ] );
}
int main () {
#ifdef LOCAL
freopen ( "in", "r", stdin );
// freopen("out","w",stdout);
#endif
perm ();
int c;
scanf ( "%d", &c );
while ( c-- ) {
ll n, m;
scanf ( "%lld%lld", &n, &m );
ll sol = C ( n, m ) * f[ m ];
printf ( "%lld\n", sol );
}
return 0;
}