HDU 2049

HDU 2049

思路

\(n\) 个人中选出\(m\)个人进行错排,即\({n \choose m}\),递推求组合数

\(m\)个人的错排公式\(f[m]=(m-1)(f[m-1]+f[m-2])\)

答案:\({n \choose m}f[m]\)

#include <bits/stdc++.h>
using namespace std;
const int N = 25;
#define endl '\n'
typedef long long LL;
LL f[N] = {0,0,1},C[N][N];
int c,n,m;
void init() {
    for(int i = 0;i < N; ++i) {//递推求组合数
        for(int j = 0;j <= i; ++j) {
            if(!j) C[i][j] = 1;
            else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]);
        }
    }
    for(int i = 3;i < N; ++i) {// 递推求排列数
        f[i] = (i - 1) * (f[i - 1] + f[i - 2]);
    }
}
int main() {
    init();
    cin >> c;
    while(c --) {
        cin >> n >> m;
        cout << C[n][m]*f[m] << endl;
    }

    return 0;
}
posted @ 2020-02-13 13:32  lukelmouse  阅读(85)  评论(0编辑  收藏  举报