测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A30308. 手套配对

填空题 困难

题目描述

手套配对

题目描述

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

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

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

输入格式

第一行包含一个正整数 t,代表测试用例组数。

接下来是t组测试用例。对于每组测试用例,一共一行。

第一行包含三个正整数 ,代表手套数量,取出的手套数和目标对数。

输出格式

对于每组测试数据,输出一个整数 n,m,k ,代表可能的情况数量对10^9 +7取模的结果。

输入样例

2

5 6 2

5 1 5

输出样例

120

0

对于全部数据,保证有 1≤t≤100000, 1≤n≤1000,1≤m≤2*n, 1≤k≤n。

参考答案

#include<bits/stdc++.h> using namespace std; const int N = 2e3+10; const int p = 1e9+7; #define ll long long ll c[N][N]; ll pw[N]; int n,m,k; void init() { pw[0]=1; for (int i=0;i<N;i++) { if(i)pw[i]=pw[i-1]*2%p; for (int j=0;j<=i;j++) { if(j==0)c[i][j]=1; else c[i][j]=(c[i-1][j]+c[i-1][j-1])%p; } } } int main() { init(); int t; cin>>t; while(t--) { cin>>n>>m>>k; if(m<2*k||m-2*k>n-k) { cout<<"0\n"; continue; } ll ans=c[n][k]*c[n-k][m-2*k]%p; ans=ans*pw[m-2*k]%p; cout<<ans<<"\n"; } }
上一题 下一题