自然数立方与连续奇数之和:推导证明与Python验证
任何一个自然数 m它的立方都可以写成 m 个连续奇数之和。这句话我第一次读到时第一反应是真的假的当时正好在翻等差数列求和公式索性拿纸笔列了一串奇数1、3、5、7、9、11、13、15、17、19、21……然后按 1 个、2 个、3 个……往下分组分到第几组和居然正好就是几的立方。那一瞬间确实有点惊艳。这个结论很适合拿来当睡前小推导结论简洁、证明不难、坑却不少而且它和平方数、等差数列、完全立方公式都能串起来。无论你是学生、老师还是单纯对数字好奇的读者都可以往下读——我尽量把推导过程写得能直接抄进笔记也把容易想当然的地方单独拎出来说清楚。1. 先别急着上证明动手拆几个立方数验证一个数学结论最笨也最踏实的方法就是多列几组例子。我把前八个自然数的立方都拆了一遍整理成一张表mm³m 个连续奇数111283 53277 9 1146413 15 17 19512521 23 25 27 29621631 33 35 37 39 41734343 45 47 49 51 53 55851257 59 61 63 65 67 69 71每一行都可以直接验算。比如 6³ 216对应的是 31、33、35、37、39、41 这 6 个连续奇数逐个相加确实等于 216。但光验证还不够我想找一个更省力的检查方法。观察第 6 行31、33、35、37、39、41把它们首尾配对31 41 7233 39 7235 37 72三对的和都是 72而 72 恰好等于 2 × 6²。也就是说这一组奇数的平均数正好是 36即 6²。再看第 5 行21、23、25、27、29中间数是 25也就是 5²。规律一下就清晰了任意 m 个连续奇数只要它们的平均数等于 m²总和就必然是 m³。而“平均数等于 m²”这件事恰恰决定了我们该从哪里开始取数。这里有一个值得停下来想想的问题如果让我直接说出“第 100 组”的起始奇数我总不能一直往下列表。下一章就专门来解决“首项怎么求”。顺带一提如果你把每一组的首项单独拿出来1、3、7、13、21、31、43……会发现相邻两项的差是 2、4、6、8、10、12也就是一个二阶等差数列。这个观察在后面的推导里也会出现算是给结论加了一个小小的注脚。2. 起始奇数怎么找两条路殊途同归求首项有两种思路。第一种适合快速计算第二种更能看清结构我建议你两条路都走一遍。2.1 方法一设首项为未知数列方程设这 m 个连续奇数的首项为 x因为奇数之间的间隔是 2所以第 m 项是 x 2(m - 1)。这 m 项构成一个等差数列项数 m首项 x末项 x 2(m - 1)。用等差数列求和公式S m × [x (x 2m - 2)] / 2括号里整理一下S m × (2x 2m - 2) / 2 m × (x m - 1)现在要求 S m³于是得到方程m × (x m - 1) m³两边约掉一个 mm 是自然数至少为 1可以放心约分x m - 1 m²所以x m² - m 1这就是首项的公式。检查奇偶性m² - m m(m - 1)两个连续整数相乘一定是偶数再加 1结果必然是奇数。也就是说这个公式自动保证了首项是个奇数不需要额外限制条件。举两个例子。m 10 时首项是 100 - 10 1 91末项是 91 2 × 9 10910 个数的平均数是 100 10²总和是 1000 10³。m 1 时首项是 1末项也是 1这时候“m 个连续奇数”就是单独一个 1结果当然等于 1³。2.2 方法二在奇数表里数位置这条路稍微绕一点但能解释一个更基本的问题为什么按 1、2、3、……个连续奇数分组就能不多不少恰好覆盖整个奇数序列把奇数排成一列第 1 个1第 2 个3第 3 个5第 4 个7……第 k 个奇数可以写成 2k - 1。现在规定第 1 组取 1 个奇数第 2 组取 2 个第 3 组取 3 个……第 m 组取 m 个。那么前 m - 1 组一共取走了1 2 3 …… (m - 1) (m - 1)m / 2个奇数。所以第 m 组应该从奇数序列的第 (m - 1)m / 2 1 个位置开始连续取 m 个。第 k 个奇数是 2k - 1把 k (m - 1)m / 2 1 代进去首项 2 × [(m - 1)m / 2 1] - 1 (m - 1)m 2 - 1 m² - m 1结果和方法一完全一致。这个方法的额外收获是它证明了“按个数递增分组”不会出现重叠或遗漏。因为前一组刚好结束在第 (m - 1)m / 2 个位置下一组就从它的下一个位置开始序列像拉链一样严丝合缝地扣在一起。有了首项整组数都能写出来。第 i 个奇数i 从 1 数到 m是m² - m 1 2(i - 1)当 i m 时末项是 m² - m 1 2m - 2 m² m - 1。于是这 m 个数可以统一写成m² - m 1, m² - m 3, ……, m² m - 1首项加末项等于 2m²平均数就是 m²。这又回到了第一章末尾的那个观察每一组连续奇数都紧紧围绕着 m² 展开。3. 三条证明思路给这个结论一个可靠的说法找出了首项公式证明其实已经完成了一大半。但同一个结论用不同方式证明能帮你理解得更深。这里分享三条思路按“直接程度”排序。3.1 等差数列求和公式一步到位这是最朴素的证法。设首项 a m² - m 1末项 b m² m - 1共有 m 项。由等差数列求和公式S m × (a b) / 2代入S m × [(m² - m 1) (m² m - 1)] / 2括号里相加(m² - m 1) (m² m - 1) 2m²所以S m × 2m² / 2 m × m² m³这个证明干净利落适合直接写进作业或笔记。它背后的逻辑是连续奇数的和等于“项数 × 平均项”而平均项正是首末两项的中点 m²。于是整个结论等价于一句话——“从 m² 的两侧对称地各取若干奇数平均数自然是 m²”。3.2 平方差把结论挂在“前 n 个奇数和等于 n²”上很多同学都知道一个经典公式1 3 5 …… (2n - 1) n²意思是前 n 个奇数的和恰好是 n 的平方。这个公式和我们要证的结论关系非常密切。我们的目标是从某个位置开始连续取 m 个奇数等价于“前若干个奇数的和”减去“前面另一段奇数的和”。设第 m 组第一个奇数在奇数表中的位置是 a也就是第 a 个奇数。那么这一组就是从第 a 个奇数取到第 a m - 1 个奇数。它的和等于前 (a m - 1) 个奇数之和 − 前 (a - 1) 个奇数之和根据前 n 个奇数和等于 n²这个差就是(a m - 1)² − (a - 1)²由第二章a (m² - m 2) / 2。代入后a m - 1 (m² - m 2) / 2 m - 1 (m² m) / 2a - 1 (m² - m) / 2于是原式变成[(m² m) / 2]² − [(m² - m) / 2]²用平方差公式分解 {[(m² m) - (m² - m)] / 2} × {[(m² m) (m² - m)] / 2} (2m / 2) × (2m² / 2) m × m² m³这条证明稍长但含金量高。它把“奇数和”与“平方数”连接起来等于在告诉读者立方数与连续奇数之间的关系本质上是从“前 n 个奇数和是平方数”这个更基础的规律长出来的。3.3 对称平均视角为什么平均数一定是 m²如果不用代数公式只看结构也能得到一个很直观的理解。连续奇数的特点是围绕中点对称。所谓“从 m² 两侧取数”要分两种情况讨论m 是奇数时m² 是奇数奇数 × 奇数 奇数它本身就落在这一组奇数的正中间。比如 m 5m² 25这一组是 21、23、25、27、2925 正好居中。左右各 2 个数关于 25 对称平均数自然是 25。m 是偶数时m² 是偶数偶数 × 偶数 偶数它不能作为奇数序列的中间项但可以成为中间两个奇数的平均值。比如 m 4m² 16这一组是 13、15、17、19中间两项是 15 和 17平均正是 16。再往外看13 和 19 关于 16 对称二者的平均值也是 16。所以无论 m 是奇数还是偶数m 个连续奇数只要能“以 m² 为中心对称展开”平均数就一定是 m²总和就是 m × m² m³。这个视角回答了一个更根本的问题为什么偏偏是 m 个为什么不是 m 1 个因为个数必须和平均数的奇偶性匹配而 m 恰好和 m² 有着相同的中心位置关系。4. 图形直觉加机器验证看得见和跑得通代数证明已经足够严谨了但我还是想说说图形直觉以及怎么用一小段代码批量验证毕竟“看得见”和“跑得通”能给人更踏实的信心。4.1 从正方形“L 形边框”说起前 n 个奇数和等于 n²这个结论有个非常著名的图形解释一开始有一个 1×1 的小方块面积是 1。想把它扩成 2×2需要在右侧和上方补三块也就是 3 块再扩成 3×3又要补 5 块。每次补的块数依次是 1、3、5、7……所以1 3 5 …… (2n - 1) n²如果把 n 换成 m²那么前 m² 个奇数的和就是 (m²)²也就是 m⁴这和标题结论不是一回事。因此要注意不能把“m³ 等于 m 个连续奇数之和”直接画成一个正方体切片的图——很多人会有这种直觉冲动但严格来说并不成立。这里的图形直觉主要用来理解“平均数 m²”这件事把连续奇数看成围绕 m² 对称的“砝码”一边多一块、另一边少一块两边互相抵消所有数都落在平均线上。如果你非要用立体画面想象可以这样看m³ 等于一个 m × m × m 的立方体把它分成 m 片薄片每片的面积是 m²再把每一片理解成一个“宽度为 1、长度为某个奇数”的长条这些长条的长度从短到长连续排列它们的平均长度正好是 m²。这算是一个勉强可用的比喻真正精确的理解还是回到对称平均那一节。4.2 Python 脚本批量验证防手滑手工验证到 8 已经有点累了干脆写个脚本跑一遍。下面这段 Python 代码做主验证def cube_odd_decompose(m): a m * m - m 1 odds [a 2 * i for i in range(m)] return odds, sum(odds) for m in range(1, 8): odds, total cube_odd_decompose(m) print(f{m}^3: { .join(map(str, odds))} {total}) # 批量断言验证 1 到 100 全部成立 for m in range(1, 101): odds, total cube_odd_decompose(m) assert total m ** 3, ffailed at {m} print(1 到 100 全部验证通过)运行结果1^3: 1 1 2^3: 3 5 8 3^3: 7 9 11 27 4^3: 13 15 17 19 64 5^3: 21 23 25 27 29 125 6^3: 31 33 35 37 39 41 216 7^3: 43 45 47 49 51 53 55 343 1 到 100 全部验证通过脚本本身很简单它的价值在于当 m 变大时人工验算太容易出错交给机器可以瞬间覆盖成百上千个例子。比如 m 100 时首项是 10000 - 100 1 9901末项是 10000 100 - 1 10099100 个数首尾配对成 50 对每对和是 20000总和恰好是 1000000 100³也就是一百万。用脚本跑一遍心里踏实。不过必须提醒一句脚本的作用是“验证”不是“证明”。计算机跑一万个例子也不能替代数学归纳或代数推导。但对个人学习和自查来说写脚本是一个非常高效的手段。5. 这个规律还能怎么长推广到任意正整数次幂标题只说了立方但探索到这里一个很自然的想法是平方是不是也满足类似规律四次方呢更进一步任意自然数的任意正整数次幂是不是都能写成若干个连续奇数之和答案是肯定的而且这个结论统一得非常漂亮。5.1 统一公式从平方到任意次幂对于任意自然数 m 和任意整数 n ≥ 2m 的 n 次幂都可以写成 m 个连续奇数之和。首项公式是m^(n-1) - m 1也就是说这一组连续奇数可以写成m^(n-1) - m 1, m^(n-1) - m 3, ……, m^(n-1) m - 1证明和前面几乎一模一样。首项加末项[m^(n-1) - m 1] [m^(n-1) m - 1] 2m^(n-1)一共 m 项平均数是 m^(n-1)所以总和是m × m^(n-1) m^n你还需要确认首项确实是奇数。分两种情况m 为奇数时m^(n-1) 是奇数减去的 m - 1 是偶数奇数减偶数得到奇数。m 为偶数时只要 n - 1 ≥ 1m^(n-1) 就是偶数减去的 m - 1 是奇数偶数减奇数得到奇数。所以公式给出的首项永远是奇数自动满足“连续奇数”的要求。这个统一规律的回溯非常有意思当 n 3 时公式退化成 m³ 的情形首项是 m² - m 1这正是我们推导的标题结论当 n 2 时首项是 m - m 1 1于是得到那个老熟人公式1 3 5 …… (2m - 1) m²也就是说标题里的“立方”并不是孤例它是“任意次幂都对应一组连续奇数”这个更大图景中的一员。平方是起点立方是其中一站四次方、五次方也都遵循着同样的规则。比如 3⁴ 81首项应该是 3³ - 3 1 25所以 25 27 29 81再比如 2⁵ 32首项是 2⁴ - 2 1 15所以 15 17 32。5.2 容易踩的三个认知坑推导看起来很顺但实际操作中我见过不少想当然的错误这里专门列出来。第一个坑把“平均数等于 m²”误当成“首项等于 m²”。有人看到 m 3 时结果是 7 9 11就会想当然地认为 m 4 时应该是 16 18 20 22。这个想法有两个问题一是 16、18、20、22 根本不是奇数二是即便用 15 17 19 21 72也不等于 64。正确的一组是以 16 为中心的四个奇数13、15、17、19。核心记忆点应该是“围绕 m² 对称取数”而不是“从 m² 开始取数”。第二个坑把“存在 m 个连续奇数的拆分”误解成“只有这一种拆法”。比如 64 4³标题给出的写法是 13 15 17 19 64。但 64 同时等于 8²而平方规律又告诉我们1 3 5 7 9 11 13 15 64这也是 8 个连续奇数的和。两种拆分都成立并不矛盾。标题只保证“存在 m 个连续奇数的写法”没有承诺唯一性。当一个数既是某个数的立方又是另一个数的平方时它自然会对应多种拆分。第三个坑关于边界情况。我们把结论写成“自然数 m 的 n 次方n ≥ 2可拆成 m 个连续奇数”这个条件很安全。但如果单纯说“任意自然数的任意次幂都可以”就要小心 n 1 的情况。当 n 1 时公式给的是 m¹ m首项变成 1 - m 1 2 - m。比如 m 3 时可以写成 (-1) 1 3 3虽然也成立但出现了负数。在“写成自然数连续奇数之和”的语境里我们通常希望所有项都是正的所以 n 1 的负奇数写法只能算数学上的小彩蛋不能作为正常表示。5.3 用 2024 做一个大型练习标题里带了一个日期 2024-10-17那就拿 2024 来做一个有点规模感的练习。既然结论对任意自然数成立我们来拆 2024³。根据首项公式首项 2024² - 2024 12024² 4096576所以首项 4096576 - 2024 1 4094553末项 2024² 2024 - 1 4096576 2024 - 1 4098599这 2024 个连续奇数从 4094553 开始每一项加 2一直加到 4098599。它们的平均数是 2024² 4096576所以总和是2024 × 4096576 2024³手工验证这 2024 个数当然不现实但利用对称配对很容易“目测”出结果2024 是偶数这串奇数围绕 4096576 对称可以分成 1012 对每一对的和都是 2 × 4096576 8193152。于是总和是 1012 × 8193152恰好等于 2024 × 4096576。这个计算留给读者按计算器结论不会有悬念。这套观察方法也可以反向使用如果一个数能拆成若干个连续奇数之和那么它必然可以被拆成“个数 × 平均数”的形式。判断一个数能不能拆、能拆成多少种核心就是在它的因子里寻找合适的“奇数个数”与“中心值”。这一点在平方数那里特别明显在立方数那里也一样成立。我的建议是下次再看到类似“存在几个连续数满足某种和”的结论不要急着搜答案先拆两个小例子看看平均值落在哪再顺手写个几十行的脚本验证一番。很多看似神奇的规律拆开之后会发现背后只是“对称 平均”这两个朴素的词。

相关新闻

最新Nessus2026.10.8版本主机漏洞扫描/探测工具Windows/Linux

最新Nessus2026.10.8版本主机漏洞扫描/探测工具Windows/Linux

前言 Nessus号称是世界上最流行的扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑扫描服务,并随时更新其数据库。Nessus不同于传统的扫描软件,Nessus可同时在本机或远端上遥控,进行系统的分析扫描。对应渗透测试…

2026/10/12 5:44:22 阅读更多 →
psutil详解:用Python搞定CPU、内存与进程监控

psutil详解:用Python搞定CPU、内存与进程监控

前阵子公司一台线上服务CPU突然飙到100%,我用系统自带的任务管理器看了半天,除了一个pid能锁定,剩下的信息全靠猜。后来发现这个进程是哪个服务的、占了多少内存、网络连了哪里,全是黑盒。那次之后我花了两天把psutil完整过了一遍…

2026/10/12 5:44:22 阅读更多 →
编程循环控制核心:break与continue用法详解与多语言实战对比

编程循环控制核心:break与continue用法详解与多语言实战对比

做开发这几年,几乎每个项目里都会碰上循环控制的问题。for 循环本身很简单,真正让新手挠头、让老手翻车的,往往是循环体里的那两个关键字:break 和 continue。很多新手写循环,要么不敢用 break 导致白白跑完全部数据&a…

2026/10/12 5:44:22 阅读更多 →

最新新闻

DeepSeek开源算力地基:FlashMLA与DeepEP如何加速国产大模型?

DeepSeek开源算力地基:FlashMLA与DeepEP如何加速国产大模型?

先说明一下我的第一反应:看到“致敬,DeepSeek 最新开源的不是模型,是国产算力的地基”这个标题,我以为是又一个大模型权重开源了。结果点进仓库一看,里面没有模型文件,躺着的全是 FlashMLA、DeepEP、DeepGE…

2026/10/12 7:08:08 阅读更多 →
NumPy随机函数与广播机制:维度对齐、代码实战与踩坑全解

NumPy随机函数与广播机制:维度对齐、代码实战与踩坑全解

【day 48】随机函数与广播机制,打卡到这个组合的时候,我明显感觉身边不少同学开始卡壳了:随机函数单独用没问题,广播规则单独看也能理解,但真到写代码的时候,要么随机生成的数组形状对不上,要么…

2026/10/12 7:08:08 阅读更多 →
MTCNN人脸检测详解:P-Net、R-Net、O-Net三级网络训练与部署实战

MTCNN人脸检测详解:P-Net、R-Net、O-Net三级网络训练与部署实战

简介:面向深度学习和计算机视觉研究者,这份完整代码基于MTCNN级联卷积网络实现人脸检测,清晰覆盖P-Net候选框提议、R-Net边界框精修、O-Net关键点定位的完整流程。包体共80个文件,以Python源码为核心,包含48个py文件&a…

2026/10/12 7:08:08 阅读更多 →
物联网通信技术选型与架构设计:从链路预算到协议栈的工程实践指南

物联网通信技术选型与架构设计:从链路预算到协议栈的工程实践指南

干了十几年通信,最明显的感觉是:打电话的人越来越少,问"能不能帮我把这个箱子里的定位数据传回来"的人越来越多。物联网这个概念被炒了很多年,别人看到的是智能家居、智慧城市、大风口,我看到的是另一件事—…

2026/10/12 7:08:08 阅读更多 →
MyBatis查询功能全解析:从动态SQL到性能优化的实战指南

MyBatis查询功能全解析:从动态SQL到性能优化的实战指南

项目标题: MyBatis各种查询功能用到一定年头你就会发现,MyBatis的查询功能说难不难,说简单也绝不是写个select标签就完事。日常开发里,动态条件、分页、多表嵌套、批量操作,任何一个场景都能写出好几种不同写法,而每种…

2026/10/12 7:08:08 阅读更多 →
老毛桃UEFI启动盘v7.0:稳过Secure Boot,原生支持NVMe与Win11架构识别

老毛桃UEFI启动盘v7.0:稳过Secure Boot,原生支持NVMe与Win11架构识别

简介:老毛桃U盘启动盘制作工具(UEFI版 装机版)v7.0是一款面向电脑初学者与系统维护人员的轻量级系统辅助工具,专为快速制作兼容UEFI与传统BIOS的U盘启动盘、安装原版Windows系统及执行PE环境下的故障排查而设计。资源包共2个文件&…

2026/10/12 7:07:08 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →