洛谷 P11250 [GESP202409 八级] 手套配对-普及/提高-

题目描述

小杨有 n n n 对不同的手套,每对手套由左右各一只组成。

小杨想知道从中取出 m m m 只手套,恰好包含 k k k 对手套的情况有多少种。

小杨认为两种取出的情况不同,当且仅当两种情况取出的手套中存在不同的手套(同一对手套的左右手也视为不同的手套)。

输入格式

本题单个测试点内由多组测试数据。第一行是一个整数 t t t,表示测试用例数量。接下来是 t t t 组测试用例,每组一行。

每组数据只有一行三个正整数 n , m , k n,m,k n,m,k,表示手套数量、取出的手套数和目标对数。

输出格式

对每组数据,输出一行一个整数表示答案对 10 9 + 7 10^9 + 7 109+7 取模的结果。

输入输出样例 #1

输入 #1

2
5 6 2
5 1 5

输出 #1

120
0

说明/提示

子任务 占比 t t t n n n m m m k k k
1 1 1 30 % 30\% 30% ≤ 5 \leq 5 5 1000 1000 1000 ≤ 3 \le 3 3 = 1 =1 =1
2 2 2 30 % 30\% 30% ≤ 5 \leq 5 5 ≤ 5 \leq 5 5 ≤ 10 \leq 10 10 ≤ 5 \leq 5 5
3 3 3 40 % 40\% 40% 10 5 10^5 105 1000 1000 1000 2000 2000 2000 2000 2000 2000

对全部的测试数据,保证 1 ≤ t ≤ 10 5 1 \leq t \leq 10^5 1t105 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000 1 ≤ m ≤ 2 × n 1 \leq m \leq 2 \times n 1m2×n 1 ≤ k ≤ n 1 \le k \le n 1kn

solution

C n k ∗ C n − k m − 2 k ∗ 2 m − 2 k C_n^k * C_{n - k} ^ {m - 2k} * 2 ^ {m - 2k} CnkCnkm2k2m2k

代码

#include 
#include "bit"
#include "vector"
#include "unordered_set"
#include "set"
#include "queue"
#include "stack"
#include "algorithm"
#include "bitset"
#include "cstring"

using namespace std;

/*
 * C(n, k) * C(n - k, m - 2k) * 2 ** (m - 2k)
 */

int n, t, m, k, c[1001][1001], N = 1e9 + 7, p[1001];

void init() {
    c[0][0] = 1;
    p[0] = 1;
    for (int i = 1; i <= 1000; i++) {
        c[i][0] = 1;
        p[i] = p[i - 1] * 2 % N;
        for (int j = 1; j <= i; j++) {
            c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % N;
        }
    }
}

int main() {
    cin >> t;
    init();
    while (t--) {
        cin >> n >> m >> k; // k <= n,  m <= 2n
        if (m < 2 * k || m - 2 * k > n - k) cout << 0 << endl;
        else {
            cout << 1ll * c[n][k] * c[n - k][m - 2 * k] % N * p[m - 2 * k] % N << endl;
        }
    }


}



结果

洛谷 P11250 [GESP202409 八级] 手套配对-普及/提高-_第1张图片

你可能感兴趣的:(洛谷,c++,算法,洛谷,数据结构)