news 2026/6/12 4:33:23

2024年9月GESP真题及题解(C++八级): 手套配对

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2024年9月GESP真题及题解(C++八级): 手套配对

2024年9月GESP真题及题解(C++八级): 手套配对

题目描述

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

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

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

输入格式

本题单个测试点内有多组测试数据

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

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

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

输出格式

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

输入输出样例 1
输入 1
2 5 6 2 5 1 5
输出 1
120 0
说明/提示
子任务占比t ttn nnm mmk kk
1 1130 % 30\%30%≤ 5 \leq 55≤ 1000 \leq 10001000≤ 3 \le 33= 1 =1=1
2 2230 % 30\%30%≤ 5 \leq 55≤ 5 \leq 55≤ 10 \leq 1010≤ 5 \leq 55
3 3340 % 40\%40%≤ 10 5 \leq 10^5105≤ 1000 \leq 10001000≤ 2000 \leq 20002000≤ 2000 \leq 20002000

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

思路分析

这是一个组合计数问题。我们有 n 对不同的手套,每对手套有左、右手各一只。需要从这 2n 只手套中取出 m 只手套,使得取出的手套恰好包含 k 对完整的手套(即 k 对手套的左右手都在取出的集合中)。

关键点:
  • 每对手套的左右手是不同的(即左手和右手是不同的手套)
  • 恰好包含 k 对完整的手套
  • 剩下的 (m-2k) 只手套必须是单只的,不能形成新的完整对
  • 单只的手套不能来自已经配对的 k 对(否则那一对就不完整了)
推导过程:
  1. 选择完整的 k 对:从 n 对中选择 k 对,方案数:C(n, k)

  2. 剩下的 (m-2k) 只单只手套

    • 这些单只手套必须来自剩下的 (n-k) 对中
    • 从 (n-k) 对中,每对最多取 1 只(否则会形成新的完整对)
    • 从 (n-k) 对中选择 (m-2k) 对,方案数:C(n-k, m-2k)
    • 对于选择的每一对,可以取左手或右手,方案数:2m − 2 k ^{m-2k}m2k
  3. 总方案数:C(n, k) × C(n-k, m-2k) × 2m − 2 k ^{m-2k}m2k

  4. 边界条件

    • 当 m < 2k 时:不可能有 k 对完整的手套
    • 当 m-2k > n-k 时:不可能从 (n-k) 对中取出那么多单只手套(因为每对最多取 1 只)
    • 当 k > n 时:不可能有那么多对完整的手套
算法设计:
  1. 预处理组合数 C[ n ] [ k ] [n][k][n][k]和 2 的幂次
  2. 对于每个查询,判断边界条件
  3. 计算组合数公式
时间复杂度:
  • 预处理组合数:O(N²),N=1000
  • 每个查询:O(1)
  • 总复杂度:O(N² + T),可以接受

代码实现

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMOD=1e9+7;constintN=1010;// n的最大值constintM=2010;// m的最大值// 组合数表ll C[N][N];// 2的幂次表ll pow2[M];// 预处理组合数和2的幂voidinit(){// 组合数预处理for(inti=0;i<N;i++){C[i][0]=C[i][i]=1;for(intj=1;j<i;j++){C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;}}// 2的幂预处理pow2[0]=1;for(inti=1;i<M;i++){pow2[i]=(pow2[i-1]*2)%MOD;}}intmain(){init();intt;cin>>t;while(t--){intn,m,k;cin>>n>>m>>k;// 边界条件检查if(m<2*k){cout<<0<<endl;continue;}intsingle=m-2*k;// 单只手套数量// 单只手套不能超过剩余的对数if(single>n-k){cout<<0<<endl;continue;}// 计算方案数ll ans=C[n][k];// 选择k对完整手套ans=ans*C[n-k][single]%MOD;// 选择哪些对取单只ans=ans*pow2[single]%MOD;// 每对可以选择左手或右手cout<<ans<<endl;}return0;}

功能分析

变量说明:
  • C[N][N]:组合数表,C[i][j]表示从 i 个中选 j 个的组合数
  • pow2[M]:2 的幂次表,pow2[i]表示 2^i
  • n:手套对数
  • m:取出的手套总数
  • k:目标完整对数
  • single = m - 2*k:单只手套的数量
函数说明:
  • init():预处理组合数表和 2 的幂次表
    • 组合数使用递推公式:C(n,k) = C(n-1,k) + C(n-1,k-1)
    • 2 的幂使用递推:2^i = 2^(i-1) * 2
边界条件检查:
  1. if (m < 2 * k):如果取出的手套总数少于 2k,不可能有 k 对完整的手套
  2. if (single > n - k):如果单只手套数量大于剩余的对数,无法满足每对最多取 1 只的条件
公式计算:
  1. C[n][k]:从 n 对中选择 k 对完整手套
  2. C[n-k][single]:从剩余的 (n-k) 对中选择 single 对来取单只手套
  3. pow2[single]:对于每个选择的单只手套,可以取左手或右手
示例测试:

输入:

2 5 6 2 5 1 5

计算过程:

  1. n=5, m=6, k=2

    • single = 6-4 = 2
    • 检查:m=6≥2k=4,single=2≤n-k=3
    • 计算:C[ 5 ] [ 2 ] [5][2][5][2]= 10, C[ 3 ] [ 2 ] [3][2][3][2]= 3, pow2[2] = 4
    • 结果:10×3×4 = 120
  2. n=5, m=1, k=5

    • single = 1-10 = -9
    • 检查:m=1<2k=10 → 输出 0
复杂度分析:
  • 预处理:O(N²) = 1000×1000 = 1e6 次运算
  • 每个查询:O(1) 直接查表计算
  • 总查询:最多10 5 10^5105次,总复杂度可行

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 0:10:04

终极指南:轻松上手Sortable.js拖拽排序功能

终极指南&#xff1a;轻松上手Sortable.js拖拽排序功能 【免费下载链接】Sortable 项目地址: https://gitcode.com/gh_mirrors/sor/Sortable Sortable.js是一个功能强大的JavaScript库&#xff0c;专门用于实现现代化的拖拽排序功能。无论你是前端新手还是资深开发者&a…

作者头像 李华
网站建设 2026/6/9 0:51:01

SSH主机密钥验证错误:原因、风险与解决方案指南

SSH主机密钥验证错误&#xff1a;原因、风险与解决方案指南 引言 在使用SSH或SCP连接远程服务器时&#xff0c;许多用户都遇到过这样的警告信息&#xff1a; scp ./MyCyberSecurityTools/BurpAgent-1.1-SNAPSHOT.jar kali192.168.3.102:/home/kaliWARNING: REMOTE HOST IDENTIF…

作者头像 李华
网站建设 2026/6/12 15:27:43

突破网盘限速技术壁垒:2025年直链下载解决方案深度解析

突破网盘限速技术壁垒&#xff1a;2025年直链下载解决方案深度解析 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&…

作者头像 李华
网站建设 2026/6/9 16:12:01

Steam饰品交易神器:四大平台实时比价工具全面解析

Steam饰品交易神器&#xff1a;四大平台实时比价工具全面解析 【免费下载链接】SteamTradingSiteTracker Steam 挂刀行情站 —— 24小时自动更新的 BUFF & IGXE & C5 & UUYP 挂刀比例数据 | Track cheap Steam Community Market items on buff.163.com, igxe.cn, c…

作者头像 李华
网站建设 2026/6/12 16:46:45

Gemini Balance快速部署指南:构建智能API代理与负载均衡系统

Gemini Balance快速部署指南&#xff1a;构建智能API代理与负载均衡系统 【免费下载链接】gemini-balance gemini轮询代理服务 项目地址: https://gitcode.com/GitHub_Trending/ge/gemini-balance 你是否在为管理多个Gemini API密钥而烦恼&#xff1f;是否希望有一个简单…

作者头像 李华
网站建设 2026/6/10 1:21:00

智能证件照制作系统源码,无需任何图像处理技能直接生成

温馨提示&#xff1a;文末有资源获取方式先进的AI技术核心&#xff1a;本系统采用前沿的AI智能证件照大模型&#xff0c;能够快速准确地识别人脸&#xff0c;用户仅需上传一张日常照片&#xff0c;即可在1秒内完成证件照生成。这项技术大幅提升了制作效率&#xff0c;解决了传统…

作者头像 李华