【算法解析】n×m 网格中正方形与长方形数量的数学推导与高效计算(漫画解析)
【算法解析】n×m 网格中正方形与长方形数量的数学推导与高效计算在算法竞赛和编程面试中经常遇到一类经典问题给定一个n × m n \times mn×m的方格棋盘求其中包含多少个正方形、多少个长方形不包含正方形。本文将从原理出发详细推导其数学公式并提供两种实现方式的对比分析最终给出最优解。典型题目链接P2241 统计方形数据加强版一、问题理解题目中的“n × m n \times mn×m方格”指的是由n nn行、m mm列单位小方格组成的矩形网格。我们需要统计所有可能的正方形区域边长为 1, 2, …,min ⁡ ( n , m ) \min(n, m)min(n,m)且边与网格线对齐所有可能的长方形区域不含正方形即矩形中长 ≠ 宽的部分。注意这里的“矩形”包括正方形而“长方形”在本题语境下特指“非正方形的矩形”。二、总矩形数的推导任意一个矩形由其上下边界和左右边界唯一确定。在一个n × m n \times mn×m的网格中水平方向有n 1 n1n1条横线从中任选 2 条作为上下边界共有n ( n 1 ) 2 \frac{n(n1)}{2}2n(n1)​种选法垂直方向有m 1 m1m1条竖线从中任选 2 条作为左右边界共有m ( m 1 ) 2 \frac{m(m1)}{2}2m(m1)​种选法。因此所有矩形的总数为T n ( n 1 ) 2 ⋅ m ( m 1 ) 2 T \frac{n(n1)}{2} \cdot \frac{m(m1)}{2}T2n(n1)​⋅2m(m1)​该公式简洁且高效是后续计算的基础。漫画演示三、正方形数量的两种求法方法一枚举边长循环法设正方形边长为k kk1 ≤ k ≤ min ⁡ ( n , m ) 1 \leq k \leq \min(n, m)1≤k≤min(n,m)则其左上角可在( n − k 1 ) × ( m − k 1 ) (n - k 1) \times (m - k 1)(n−k1)×(m−k1)个位置放置。因此正方形总数为S ∑ k 1 min ⁡ ( n , m ) ( n − k 1 ) ( m − k 1 ) S \sum_{k1}^{\min(n,m)} (n - k 1)(m - k 1)Sk1∑min(n,m)​(n−k1)(m−k1)该方法直观易懂时间复杂度为O ( min ⁡ ( n , m ) ) O(\min(n, m))O(min(n,m))。对于n , m ≤ 5000 n, m \leq 5000n,m≤5000的数据范围最多执行 5000 次循环在实际运行中完全可接受。方法二闭式公式数学优化通过代数变换上述求和可转化为闭式表达。令a min ⁡ ( n , m ) a \min(n, m)amin(n,m)b max ⁡ ( n , m ) b \max(n, m)bmax(n,m)则S ∑ k 1 a ( a − k 1 ) ( b − k 1 ) ∑ x 1 a x ( b − a x ) S \sum_{k1}^{a} (a - k 1)(b - k 1) \sum_{x1}^{a} x(b - a x)Sk1∑a​(a−k1)(b−k1)x1∑a​x(b−ax)令d b − a d b - adb−a利用求和公式∑ x a ( a 1 ) 2 \sum x \frac{a(a1)}{2}∑x2a(a1)​和∑ x 2 a ( a 1 ) ( 2 a 1 ) 6 \sum x^2 \frac{a(a1)(2a1)}{6}∑x26a(a1)(2a1)​可得S d ⋅ a ( a 1 ) 2 a ( a 1 ) ( 2 a 1 ) 6 a ( a 1 ) ( 3 b − a 1 ) 6 S d \cdot \frac{a(a1)}{2} \frac{a(a1)(2a1)}{6} \frac{a(a1)(3b - a 1)}{6}Sd⋅2a(a1)​6a(a1)(2a1)​6a(a1)(3b−a1)​此即正方形数量的闭式公式计算仅需常数时间。验证示例以n 2 , m 3 n 2, m 3n2,m3为例a 2 , b 3 a 2, b 3a2,b3S 2 ⋅ 3 ⋅ ( 9 − 2 1 ) 6 6 ⋅ 8 6 8 S \frac{2 \cdot 3 \cdot (9 - 2 1)}{6} \frac{6 \cdot 8}{6} 8S62⋅3⋅(9−21)​66⋅8​8与手动枚举结果一致。漫画演示四、长方形数量的计算根据容斥原理长方形数量 总矩形数 − 正方形数量 T − S \text{长方形数量} \text{总矩形数} - \text{正方形数量} T - S长方形数量总矩形数−正方形数量T−S无需单独枚举非正方形矩形避免了复杂的分类讨论。五、代码实现对比循环法清晰直观longsquares0;intminMath.min(n,m);for(intk1;kmin;k){squares(long)(n-k1)*(m-k1);}闭式法高效优雅longaMath.min(n,m);longbMath.max(n,m);longsquaresa*(a1)*(3*b-a1)/6;注意所有变量必须使用long类型防止中间结果溢出。当n m 5000 n m 5000nm5000时最大中间值约为2.5 × 10 11 2.5 \times 10^{11}2.5×1011远超int范围约2 × 10 9 2 \times 10^92×109。漫画演示六、效率与适用性分析维度循环法闭式法时间复杂度O ( min ⁡ ( n , m ) ) O(\min(n, m))O(min(n,m))O ( 1 ) O(1)O(1)实际运行时间微秒级≤5000 次纳秒级代码长度稍长极简可扩展性仅适用于较小规模适用于极大n , m n, mn,m只要不超 long通用性仅适用于标准网格正方形计数同左虽然在本题数据范围内两者性能差异在 OJ 上可能都显示为 0ms但闭式法体现了“用数学优化算法”的核心思想是更优的工程实践。七、公式的适用边界该闭式公式仅适用于以下条件同时满足的情形网格完整无缺无障碍物正方形边必须与网格线平行不允许旋转统计所有尺寸的正方形总数。若问题变体涉及障碍物、旋转正方形、仅统计特定边长、或三维扩展等则需重新建模不能直接套用此公式。漫画演示八、总结总矩形数T n ( n 1 ) 2 ⋅ m ( m 1 ) 2 \displaystyle T \frac{n(n1)}{2} \cdot \frac{m(m1)}{2}T2n(n1)​⋅2m(m1)​正方形数S a ( a 1 ) ( 3 b − a 1 ) 6 \displaystyle S \frac{a(a1)(3b - a 1)}{6}S6a(a1)(3b−a1)​其中a min ⁡ ( n , m ) , b max ⁡ ( n , m ) a \min(n,m), b \max(n,m)amin(n,m),bmax(n,m)长方形数T − S T - ST−S推荐在实际编程中优先采用闭式公式法它不仅效率更高而且代码简洁、逻辑严谨是解决此类组合计数问题的最佳实践。

相关新闻

传感器01-相机:

传感器01-相机:

传感器01-相机:

2026/7/3 16:56:51 阅读更多 →
小白福利!收藏这份AI大模型自学路线,带你从入门到精通(附104G免费学习资源)

小白福利!收藏这份AI大模型自学路线,带你从入门到精通(附104G免费学习资源)

本文提供了一条完整的AI大模型自学路线,适合新手小白。内容涵盖数学与编程基础、机器学习入门、深度学习深入、大模型探索、进阶与应用以及社区与资源等方面。文章推荐了丰富的学习资源和实践项目,帮助读者系统学习AI大模型技术,并提供了免费…

2026/7/4 3:04:15 阅读更多 →
0基础能不能转大模型?到底怎么转?大模型实战指南:小白程序员2026年转行AI必读(收藏版)

0基础能不能转大模型?到底怎么转?大模型实战指南:小白程序员2026年转行AI必读(收藏版)

本文为想进入AI大模型领域的初学者提供了实用的转行指南。文章首先澄清了大模型与ChatGPT的区别,并介绍了大模型技术栈的各个层面。接着,针对新人常见的三个误区提供了指导,强调了工程能力的重要性。文章还详细分析了四个主要的大模型岗位方向…

2026/5/17 5:29:33 阅读更多 →

最新新闻

如何3分钟解决iPhone USB网络共享:Windows苹果驱动一键安装完整指南

如何3分钟解决iPhone USB网络共享:Windows苹果驱动一键安装完整指南

如何3分钟解决iPhone USB网络共享:Windows苹果驱动一键安装完整指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitco…

2026/7/4 19:21:30 阅读更多 →
Linux rm命令详解:安全删除文件与目录的30个技巧

Linux rm命令详解:安全删除文件与目录的30个技巧

1. Linux删除命令基础解析 在Linux系统中,文件删除操作是每个系统管理员和开发者必须掌握的核心技能。不同于图形界面操作系统的回收站机制,Linux命令行下的删除操作往往具有"一锤定音"的特性——这意味着我们需要对删除命令有更深入的理解才能…

2026/7/4 19:19:30 阅读更多 →
Python项目安全配置实战:从.env文件风险到密钥管理最佳实践

Python项目安全配置实战:从.env文件风险到密钥管理最佳实践

1. 项目概述:为什么.env文件的安全如此重要?如果你是一个Python开发者,尤其是刚入门不久,那么你大概率已经接触过.env文件了。它看起来人畜无害,就是一个简单的文本文件,里面放着KEYVALUE这样的键值对。在本…

2026/7/4 19:17:29 阅读更多 →
零代码构建AI应用:Coze与Dify平台从入门到实战全解析

零代码构建AI应用:Coze与Dify平台从入门到实战全解析

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 你是不是也遇到过这样的困惑:想用 AI 提升工作效率,但面对“Agent”、“工作流”、“知识库”这些概念一头雾水…

2026/7/4 19:15:29 阅读更多 →
MyBatis流式查询实战:解决海量数据查询内存溢出难题

MyBatis流式查询实战:解决海量数据查询内存溢出难题

在实际 Java 后端开发中,处理海量数据查询是一个绕不开的挑战。很多开发者都遇到过这样的场景:一个看似简单的SELECT * FROM large_table查询,在测试环境可能运行正常,一旦部署到生产环境,面对百万甚至千万级别的数据&…

2026/7/4 19:15:29 阅读更多 →
JWT认证原理与ASP.NET Core实践指南

JWT认证原理与ASP.NET Core实践指南

1. JWT认证基础与核心原理在构建现代Web API时,认证机制是保障系统安全的第一道防线。JWT(JSON Web Token)作为一种轻量级的开放标准(RFC 7519),已经成为RESTful API认证的主流方案。与传统的Session-Cooki…

2026/7/4 19:13:29 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻