简介:《离散数学(西电第三版)》教材 PDF 及配套课后习题参考答案,主要面向计算机科学与技术、软件工程、信息技术等专业学生,以及需要夯实离散数学基础的考研人群。内容覆盖集合论、关系与函数、图论、组合数学、数理逻辑等核心章节,每部分均配有定义、定理、证明与典型例题,并在书末整理了大量课后习题答案,方便读者在自学或复习时对照检验。资源为单个 PDF 文件,压缩包大小约 9.26 MB,支持全文检索与目录跳转,适合在电脑、平板或手机上随时查阅。目前已有 402 人参与学习下载,常被用于期末冲刺、考研第一阶段复习及平时作业辅导。与纯文字教材不同,该资源将教材正文与答案整合在一起,既适合系统学习知识脉络,也能针对具体题目展开推演。习题后附有详细的解题步骤与思路点拨,有助于弥补课堂上理解不深之处,对提升解题能力与概念掌握都很有帮助,是一份兼顾理论性与实用性的学习资料。
1. 《离散数学》第三版到底在讲什么:先像整理衣柜一样理解"离散"
很多人第一次翻开这本教材时,都会有个共同的疑惑:为什么这本书里没有连续的函数图像,没有导数,也没有积分,全是集合、箭头、圆圈和逻辑符号?打个比方,高等数学研究的是水流——连续、光滑、可以用微积分描述变化趋势;离散数学研究的是沙堆——一粒一粒独立存在,每一粒都清清楚楚、互不粘连。计算机处理的数据正是这种"沙堆"式的离散对象:内存地址、网络数据包、数据库记录,没有哪一样是连续流动的。
这本由某高校编的《离散数学》第三版,就是把集合论、关系与函数、图论、组合数学、数理逻辑这五大板块串在一起,让计算机相关专业的学生建立一套通用的数学语言。它之所以值得搞懂,是因为计算机本质上只能处理离散的东西,程序里的一切逻辑,归根结底都在和"一个一个的对象"打交道。有些读者是冲着教材答案来的,但先把这本书本身讲明白,才是更重要的第一步。
2. 集合论与关系函数:整座大厦的地基
2.1 集合论:把世界"装进抽屉"的数学
集合的概念虽然高中就见过,但大学教材会把它做得更严格。集合就是把确定的、可区分的对象汇集在一起,这些对象叫元素。注意两个关键词:"确定"意味着任何一个对象都能明确判断是否属于这个集合,不存在"大概属于"这种模糊说法;"可区分"意味着集合里的元素互不相同,重复的元素在集合里只算一次。
用一个生活场景来理解:整理衣柜时,袜子放一个抽屉,衬衫放一个抽屉,帽子放一个格子。每个抽屉就是一个集合,抽屉里的每件物品就是元素。并集就是把两个抽屉的东西合并,交集是两边都有的衣物,差集是从一个抽屉里拿走那些也在另一个抽屉里的东西。用数学语言写,设 A = {1, 2, 3},B = {3, 4, 5},那么并集 A ∪ B = {1, 2, 3, 4, 5},交集 A ∩ B = {3},差集 A \ B = {1, 2}。
这些运算看起来简单,在程序开发里却非常常见。数据去重就是让数据进入一个集合,重复项自动消失;权限系统里的黑白名单计算,本质上是集合的交集和差集;规则引擎做多条件匹配时,底层经常用集合运算来合并中间结果。可以说,凡是涉及到"一批东西的组合与筛选"的场景,集合运算都在背后起作用。
教材在集合论部分还重点讲了幂集与笛卡尔积。幂集是某个集合所有子集组成的集合,比如集合 {a, b} 的幂集是 {∅, {a}, {b}, {a, b}},它有 2² = 4 个元素。一般的,一个有 n 个元素的集合,其幂集有 2ⁿ 个元素。这个结论在分析算法复杂度时高频出现:为什么有些搜索问题面对十几个输入就慢得离谱?因为解空间的规模是输入集合的幂集大小,2ⁿ 的增长速度远快于任何多项式曲线。
笛卡尔积则是两个集合做"配对":A × B 是所有形如 (a, b) 的有序对组成的集合。平面坐标系上的每个点,就是实数集与实数集的笛卡尔积;二维数组的索引组合,本质上是 int × int 的笛卡尔积。理解笛卡尔积,就能明白为什么数据库里的连接查询有时会产生大量行——两张表做连接,是在记录集合上先做笛卡尔积,再按条件筛选。
学习集合论这一章时,有一个值得养成的习惯:每学一个运算性质,就随手把它翻译成一个条件表达式。比如德摩根定律说的是 (A ∪ B)ᶜ = Aᶜ ∩ Bᶜ,翻译成代码就是 !(a || b) 等价于 !a && !b。这种数学到代码的转译练习,能让你在学数学的同时提升对程序逻辑的敏感度。教材在每节后配置的例题,正是为了训练这种转译能力。
2.2 关系与函数:描述事物之间"连线"的规则
集合解决的是"有什么",关系和函数解决的是"谁和谁怎么关联"。教材给关系的定义是:设 A、B 是两个集合,A 到 B 的二元关系是 A × B 的一个子集。也就是说,从 A 里取一个元素,从 B 里取一个元素,配对之后挑出那些符合条件的配对。
用大家熟悉的场景来理解:班级里的学生和课程分组之间,有一个"选课"关系。学号为 S001 的同学选了 A 组,学号为 S002 的同学选了 B 组,把这些配对整理出来,就是一张关系表。数据库里的表在形式上就是关系的实例,这不是巧合——关系型数据库这个名称的数学来源正是这里。
关系的性质是本章的重要考点。一个关系可能同时具备自反性、对称性、传递性,也可能一个都不具备。自反性指每个元素都与自身存在关系;对称性指如果 a 与 b 有关系,那么 b 与 a 也有关系;传递性指如果 a 与 b 有关系,且 b 与 c 有关系,那么 a 与 c 也有关系。这三个性质放在一起,会引出两个重要结构:等价关系与偏序关系。
等价关系是同时满足自反、对称、传递的关系,它能将集合里的元素划分成若干互不相交的等价类。举例来说,"两个整数除以 3 的余数相同"是一个等价关系,所有整数被分到余数为 0、1、2 的三个等价类中。等价类的思想在状态机建模、无向图连通分量计算中反复出现。偏序关系则满足自反、反对称、传递,它描述的是一种"比较"结构。安排课程计划时,课程的先修关系就是偏序的:高等数学先于离散数学,离散数学先于数据结构,数据结构先于算法分析。
函数是关系的一个特殊子类:每个输入恰好对应一个输出。教材会依次介绍单射、满射、双射。用一个比喻帮助记忆:把函数看成一台自动售货机。单射意味着投不同的硬币不会掉出相同商品;满射意味着每种商品都至少能被某一种硬币买到;双射则是硬币与商品一一对应,不多不少。这个直观图景一旦建立,复合函数、逆函数的概念就容易接受了。
关系的复合运算也是这一节的重点。关系 R 和 S 的复合可以理解为"先满足 S 再满足 R"的有序对集合,用生活语言讲就是"先找认识的人,再找认识他的人"。关系的复合对应着邻接矩阵的乘法,图论里的传递闭包算法就是基于关系的复合思想。把这一部分学扎实,后续学习图论和矩阵运算会轻松很多。
2.3 为什么说这两章是"地基中的地基"
如果把整本教材比作一栋楼,集合论是地基,关系与函数是梁柱。后面三章都在这套基础上生长:图的顶点集与边集都是集合,边可以用顶点之间的二元关系描述;组合数学里的 n 选 k,是对集合子集的计数;数理逻辑里的谓词,是一个个体集合到真值集合的函数。
反过来看编程实践也一样。选择数据结构时,用"集合"还是"数组",取决于是否允许重复、是否强调顺序;设计 API 时,明确输入输出之间的映射关系,就是在定义函数;做数据建模时,实体之间的关联就是数学里的关系。这些能力不是靠背定义获得的,而是靠大量练习建立起来的。
这也是教材在集合与关系部分配置大量习题的原因。做这些题时不值得死记标准答案,更值得关注的是推理过程:判断某个关系是不是等价关系,要一步一步检验三个性质;证明两个集合相等,可以用互相包含的方式展开。这种结构性证明的思路,会直接迁移到程序正确性的推理上。
3. 图论与组合数学:最"出圈"的两章
3.1 图论:用点和线看世界
图论的开篇非常友好,因为它要研究的对象可以实实在在画出来。一个图 G = (V, E) 由顶点集合 V 和边集合 E 组成。地图上的城市、社交网络里的人、电路板上的焊点,都可以是顶点;它们之间的道路、好友关系、导线,都可以是边。这种抽象能力让图论成为应用范围最广的离散数学分支之一。
教材会先区分无向图与有向图。无向图的边没有方向,好友关系是典型的无向关系:A 是 B 的好友,B 也一定是 A 的好友。有向图的边带箭头,网页之间的超链接是有向的:A 页面链接到 B 页面,B 页面不一定链回 A。这个区别直接影响到算法设计:求无向图和有向图的最短路径、连通性,方法和复杂度都不一样。
图的几个基本概念值得反复琢磨。顶点的度数是与顶点相连的边数;有向图中还分入度与出度。握手定理说所有顶点的度数之和等于边数的 2 倍,因为每条边对两个顶点各贡献一个度数。它的推论是"奇度数顶点的个数必为偶数",这个结论在证明某些图是否存在时很有用。比如在一场聚会中,握手次数为奇数的人一定有个偶数。
路径、回路、连通性是图论的核心概念。路径是从一个顶点出发沿边走到另一个顶点;回路是起点与终点相同的路径;如果图中任意两个顶点之间都存在路径,这个图就是连通的。社交软件的好友关系网是否连通,决定了信息能否从一个人传递到另一个人;计算机网络的拓扑是否连通,决定了单点故障是否会让整个网络瘫痪。
教材还会重点介绍树。树是没有回路的连通图,它的特点是边数比顶点数少 1,并且任意两个顶点之间有且仅有一条路径。操作系统的目录结构、编译器的语法分析树、数据库的 B+ 树索引,都是树的实际应用。树作为一种特殊的图,在计算机课程中占据极其重要的位置,因为它提供了一种高效组织层次数据的方式。
这一章的难题通常集中在欧拉路径、哈密顿回路和图的着色问题上。欧拉路径就是"一笔画"问题:能否不重复地走遍所有边?判断标准令人意外地简单:欧拉路径存在的充要条件是奇度顶点个数为 0 或 2。哈密顿回路则是走遍所有顶点的回路,它没有类似欧拉路径的简单判定条件,甚至是一个 NP 完全问题。初看这些概念像智力游戏,但物流路径规划、电路板钻孔顺序、地图染色去重,都从这些抽象问题中获得了启发。
3.2 组合数学:把"数数"变成一门学问
组合数学的核心问题是计数:有多少种方法完成某件事?"n 个人排成一排有多少种排法""从 n 本书里选 k 本有多少种选法""n 对括号能组成多少种合法括号串"——这些问题看起来简单,回答起来需要一套系统的方法。
教材先从两个基本计数原理讲起。加法原理说:如果做一件事有 m 类互斥的方法,每类有若干种做法,总方法数是各类之和。乘法原理说:如果做一件事需要分几个步骤,每一步有若干种选择,总方法数是各步选择数的乘积。这两个原理是所有排列组合公式的根基。
排列与组合的公式是本章的基本工具。排列强调顺序:从 n 个元素中取 k 个排成一列,有 P(n, k) = n! / (n-k)! 种方法;组合不强调顺序:从 n 个元素中取 k 个,有 C(n, k) = n! / (k!(n-k)!) 种方法。二者的关系概括成一句话:先组合后排列,就是先选出来再排顺序。初学者容易把这两个公式搞混,唯一的判断标准就是"顺序是否重要"。
教材接着引入二项式定理:(a + b)ⁿ = Σ C(n, k) a^(n-k) b^k。这个式子把组合数放到了多项式展开的系数位置上,组合数因此也叫二项式系数。它不只是数学公式,在概率论和随机算法分析中反复出现。比如计算"抛 10 次硬币恰好 5 次正面的概率",就要用到 C(10, 5)。理解二项式系数随 n 和 k 的增减规律,对分析算法复杂度也很有帮助。
鸽巢原理是这一章最容易被轻视却极其好用的小工具。教材上的表述是:把 n+1 个物体放进 n 个抽屉,至少有一个抽屉里有至少两个物体。它的证明只有一行,应用却无处不在。证明一千个人中至少有两个生日相同、证明从 1 到 10 任取 6 个数必有一对之和为 11、证明无损压缩算法不可能压缩所有文件,靠的都是鸽巢原理。它训练的是"找抽屉"的思维:把大量对象映射到有限类别,必然有类别内对象重复。
递归关系是组合数学的进阶主题。教材通过斐波那契数列、汉诺塔等经典例子说明:一个问题的解可以由更小规模的同类问题的解组合而成。程序员对递归并不陌生,但数学层面的递推方程给递归提供了理论支撑:求解递推方程可以得到复杂度精确的闭式解,而不只是笼统的估算。组合数学这一章把"递推"从编程技巧提升到了数学模型的高度。
3.3 为什么这两章对计算机学生特别重要
如果说集合、关系和逻辑是偏抽象的骨架,图论与组合数学就是最容易看到实体的血肉。数据结构里的树是图论概念,算法里的分治与动态规划依赖组合计数和递归,网络路由表的更新基于图的连通性,搜索系统的页面排序是带权有向图上的迭代计算,安全系统的密码强度取决于密钥空间的组合数学规模。
这两章还有一个共同特点:都有"可画图"或"可列举"的一面,比集合论和数理逻辑更容易建立直觉。但也正因为如此,它们最容易让人产生错觉——以为看懂定义就会做题了。实际上,图论与组合数学的习题需要一定的灵感和大量练习,只看答案很难培养出真正的感觉。教材在这两章配置了大量习题,练习目标正是从定义到应用的迁移能力。
4. 数理逻辑:让机器学会"讲理"
4.1 命题逻辑:真假的代数系统
数理逻辑是离散数学中抽象度较高的章节,它把"推理"本身变成了数学对象。一个命题是能判断真假的陈述句。"今天下雨""x > 3"(给 x 赋值后)都是命题;"加油""这题好难"不是命题——前者是祈使句,后者依赖于主观标准。命题逻辑研究的是命题通过联结词组合后的真假关系。
教材首先给出五种联结词的真值表:否定 ¬p、合取 p ∧ q、析取 p ∨ q、蕴含 p → q、等价 p ↔ q。合取与析取对应程序里的逻辑与(&&)与逻辑或(||),这些在编程中很常见。难点通常出现在蕴含上:p → q 只有在 p 为真且 q 为假时才为假,其余情况均为真。这和自然语言中的因果关系不同,自然语言的"如果…就…"暗含时间先后和语义关联,逻辑蕴含只关心真值组合。
举例来说,命题 p:"1 > 2",命题 q:"今天星期五",那么 p → q 为真,因为 p 为假时蕴含式自动为真。这在程序的条件语句中也有对应:如果判断条件恒为 false,那么分支里的代码逻辑就不会真正影响程序整体行为。理解蕴含的真值表,能避免做逻辑化简时犯"想当然"的错误。
教材随后引入重言式与矛盾式的概念。重言式是无论命题变量取什么真值都为真的式子,比如 p ∨ ¬p;矛盾式是恒为假的式子,比如 p ∧ ¬p。判断一个式子是否为重言式,可以用真值表法,也可以用等价变换法。这是逻辑等价运算的基础,也是学习推理规则的前提。
逻辑等价是命题逻辑部分的工具箱。教材列出了交换律、结合律、分配律、德摩根律、吸收律等常用等价式,它们与集合运算的定律形成完美对应。事实上,集合代数与命题代数共享同一套结构,称为布尔代数。一个有效的学习方法是把集合运算定律与逻辑等价定律并排对照,两边的公式长得几乎一样,只是符号不同。这种横向对比能加深记忆,更能让你发现数学结构之间的同构关系。
推理规则是命题逻辑向实际应用延伸的关键。教材会介绍假言推理:由 p → q 且 p 为真,推出 q 为真;拒取式:由 p → q 且 q 为假,推出 p 为假。这些规则构成了形式化证明的基础。形式化证明听起来抽象,其实就是程序员熟悉的条件语句推理的数学化:if (A) then B,且 A 成立,就能放心地执行 B。许多形式化验证工具和程序正确性证明方法,都建立在这样的推理规则之上。
4.2 谓词逻辑:当命题里出现"变量"和"量词"
命题逻辑的局限在有些场景下很明显:"所有人都会死"这句话,如果作为命题,只能被当作一个整体;如果想进一步分析"所有人"和"会死"之间的关系,就必须拆开句子的内部结构。谓词逻辑正是为此设计的。
教材先引入谓词的概念:P(x) 表示"x 具有性质 P",比如 P(x):"x 是偶数"。这里的 x 是个体变元,它可以被具体对象替换:P(4) 为真,P(3) 为假。谓词本身不是命题,只有把变元代入具体值或用量词约束后,才成为命题。
量词是这一节的关键。全称量词 ∀ 表示"对所有",存在量词 ∃ 表示"存在"。∀x P(x) 的含义是"对所有 x,P(x) 为真";∃x P(x) 的含义是"存在某个 x 使得 P(x) 为真"。量词的否定规则很重要:
¬(∀x P(x)) 等价于 ∃x ¬P(x) ¬(∃x P(x)) 等价于 ∀x ¬P(x)用一句话记忆:"并非所有人都及格"等价于"存在至少一人没及格"。这组规则在写查询条件、做需求澄清时非常常用。写 SQL 时,NOT EXISTS 和 NOT IN 的转换,背后就是这套量词否定规则。
谓词逻辑翻译练习的价值不可小觑。把自然语言翻译成逻辑表达式,需要准确识别量词的作用范围。比如"每个学生都选了至少一门课"和"存在一门课被所有学生选了",翻译时量词顺序不同,含义也完全不同:前者是 ∀s ∃c Enroll(s, c),后者是 ∃c ∀s Enroll(s, c)。初学者经常在量词顺序上翻车,多练翻译能帮助建立敏感性。
这一章还有一个非常重要的概念:论域。论域是个体变元的取值范围。在不同论域下,同一个公式的真值可能不同。比如 ∀x P(x) 在论域为 {1, 2, 3} 时只需检查三个值,而在论域为全体自然数时就变成无限多个检查。数据库查询中的表就是某种论域,SQL 里的 NOT EXISTS 就是在某个表范围内做量词的否定判断。明确论域,是运用谓词逻辑的第一步。
4.3 逻辑能力是程序员的隐藏技能
学完数理逻辑最大的收获,不是记住了多少公式,而是多了一种审视问题的视角。拿到一段需求描述时,可以先问:这句话里的"所有""存在"用对了吗?这个条件能不能化简?这条推理链是否完整?这种用逻辑结构分析问题的能力,在调试程序时尤其有用。
当一个 bug 反复出现时,把相关条件写成逻辑表达式,常常能立刻定位到是哪个条件被忽略或写反了。教材在数理逻辑部分的例题和习题,表面上是练真值表和等价变换,实际上是在训练精确、无歧义的表达能力。代码审查里常说的"逻辑清晰",本质上是作者能准确把握每一处条件与分支之间的关系,这种能力与数理逻辑训练高度相关。
5. 常见误区:五个最容易被搞混的概念
离散数学的知识点之间关系紧密,初学者很容易在概念边界上踩坑。下面这五个误区,几乎每届学生都会遇到。每一条都按"易混点 → 为什么混 → 怎么区分"展开。
5.1 集合与序列:一个无序不重复,一个有序可重复
易混点在于:集合 {1, 2} 和序列 (1, 2) 看上去都是"一列数字",写出来差别不大。为什么容易混?因为编程语言里的数组既有顺序又允许重复,写出来像序列,打印出来又像集合。
怎么区分:问自己"顺序是否重要"。按学号排队,顺序重要,用序列;统计班上选修了哪些课程,顺序不重要且不应重复,用集合。在数学上,{1, 2} 与 {2, 1} 是同一个集合,但 (1, 2) 与 (2, 1) 是不同序列。做题时先看清楚符号:花括号 {} 表示集合,圆括号 () 表示有序对或序列。
5.2 关系与函数:函数是特殊的关系,但关系远不止函数
这个误会几乎每年都出现。关系允许一个输入对应多个输出,函数则要求每个输入恰好对应一个输出。用箭头图表示,关系是任意连线,函数是从每个左侧点出发恰好一条线。
为什么容易混?因为在编程中,数组的索引到值的映射天然就是函数,但现实中许多对应关系并不满足函数约束。比如一位老师可以带多名学生,这是关系;一个学生的学号对应唯一的姓名,这是函数。判断标准很简单:对每个输入,输出是否唯一。唯一就是函数,不唯一就是关系。做题时遇到"判断以下对应是否为函数",就是套这条标准。
5.3 路径与回路:回路也是路径,但起点终点必须相同
图论里路径和回路都有明确图形表示,混用的原因在于自然语言中"走一圈"既可以叫路径也可以叫回路。路径是从一个顶点到另一个顶点的边的序列,起点和终点可以不同;回路是起点与终点相同的路径,并且通常要求边不重复或顶点不重复。
区分方法是看起点和终点:相同且满足不重复条件,是回路;不同,是路径。另一个常见的细节是"环":从某顶点出发经过一条边回到自身的自环,属于回路的一种特殊情况。做题时先标出起点和终点,再判断是否闭合,就不容易错了。
5.4 命题逻辑与谓词逻辑:区别在有没有量词
有些同学学完数理逻辑后,分不清命题逻辑和谓词逻辑的分界。一句话可以概括:命题逻辑处理的是完整命题之间通过联结词组合,没有量词;谓词逻辑在命题基础上增加了个体变元和量词,能表达"所有"和"存在"这类普遍性判断。
之所以容易混,是因为同一个自然语句既可以用命题视角看,也可以用谓词视角看。比如"雨停了"可以作为整体命题;但"南京下雨了""北京下雨了"这类结构就需要谓词 P(city) 来表达。选择哪种视角,取决于是否需要讨论句子的内部结构。教材里的题目会明确要求用哪种系统表达,审题时留意量词是否出现,就能快速判断。
5.5 教材答案的正确用法:答案不是用来抄的
最后一个误区,跟这本教材的配套资料有关。《离散数学》第三版配有大量习题和答案,许多同学把它当成"参考答案册"来用:做一道题看一道答案,甚至直接背答案。这种做法的最大问题是,离散数学的题型变化非常多,背答案只能应对原题,一旦改数字、换问法,就会卡壳。
更合理的用法是:先合上答案独立完成习题,做完后对照答案检查思路,重点看自己在哪一步卡住;如果完全没思路,只看答案推理过程的第一行,再尝试自己推后面的部分。这样答案就从"现成的解法"变成了"检验工具",帮助真正建立推理能力。从应试角度来说,理解推理过程远比记住结论重要。
这五个误区,说到底都是"概念边界不清晰"。多花时间在定义本身和性质判断上,比盲目刷题更有效。每当你觉得题目难,先回到教材的定义部分,逐字逐句地读一遍,往往答案就藏在定义里。
6. 什么时候用得上:这本教材的边界与正确打开方式
如果有人问我,这本教材到底什么时候用得上,我会说两个场景:一个是课程学习期间,另一个是学完之后的很长时间里。
课程学习期间,它最大的意义是提供系统性的知识框架。离散数学不像高等数学那样由一条主线贯穿始终,它的五大板块相对独立:集合论偏基础,图论与组合数学偏应用,数理逻辑偏抽象。如果没有教材这样的结构组织,初学者很容易在零散的概念里迷失方向。教材告诉你先后顺序是什么、哪些是基础、哪些是延伸、各章之间的接口在哪里,这些信息比单个知识点的讲解更重要。
课程结束之后,它的价值变成了"参考与检索"。当你在数据结构课里遇到树的遍历时,翻回图论一章重看路径与连通的定义;当你在数据库课里搞不清范式时,回到关系与函数一节重新梳理函数依赖;当你在算法分析中需要估算复杂度时,组合数学里的计数技巧会提供工具。教材不是读完就束之高阁的,它是放在手边随时可以查的工具书。
那什么时候别用呢?如果你已经有较好的数学基础,只想了解某个具体算法或某一种数据结构,直接去看专项资料效率更高。这本教材覆盖面广,但单个主题的深度有限。另外,如果想靠背答案应付考试,效果会大打折扣,这一点我在前面第 5.5 节已经说过了。
我曾经也犯过类似的错误。刚学离散数学时赶进度,抄了不少参考答案,考前还背了个遍,成绩说不上难看。后来做课程设计需要自己实现一个图搜索的逻辑,我调了一整天都跑不对,那些背过的概念在关键时刻完全帮不上忙。从那以后,我每学一个新章节,都强制自己先合上答案独立推导三到五道题,再对照答案检查思路和求解步骤。这个习惯保持了整个学期,效果立竿见影。希望帮到你。
本文还有配套的精品资源,点击获取