1 条题解

  • 0
    @ 2024-11-21 22:43:03

    [GESP202409八级] 手套配对

    • 难度:普及/提高-

    • 标签:组合数

    观察数据发现 T==105T == 10 ^ 5N,MN, M 都在 10001000 左右。因此不好尝试枚举什么信息计算答案。

    尝试组合数求解:因为题目要求恰好 KK 对手套,因此表明这 KK 对手套的左右手必须都选,此部分答案贡献为 $$\binom{N}{K}$$ 。考虑剩下没选的 NKN - K 对手套当中,对于每一对手套,我们要不两只都不选,要么只能选其中一只,因此该部分答案贡献为 $$\binom{N - K}{M - K * 2} * 2^{M - K * 2}$$。两部分答案贡献乘起来即可。

    /*
    注意:数据特判,模值为1e9+7时,及时是ll也要需要注意溢出情况 
    */
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int P=1e9+7;
    int t,n,m,k;
    int c[2505][2505],e[2505];
    int main(){
    	for(int i=0;i<=2000;i++){
    		for(int j=0;j<=i;j++){
    			if(j==0||i==j){
    				c[i][j]=1;
    			}
    			else{
    				c[i][j]=c[i-1][j]+c[i-1][j-1];
    				c[i][j]%=P;
    			}
    		}
    	}
    	e[0]=1;
    	for(int i=1;i<=2000;i++){
    		e[i]=e[i-1]*2;
    		e[i]%=P;
    	}
    	cin>>t;
    	while(t--){
    		cin>>n>>m>>k;
    		if(m<2*k||m-2*k>n-k){
    			cout<<"0\n";
    		}
    		else{
    			cout<<1ll*c[n][k]*c[n-k][m-2*k]%P*e[m-2*k]%P<<endl;
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    74
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者