洛谷 P1548 [NOIP1997 普及组] 棋盘问题

题目

洛谷 P1548 [NOIP1997 普及组] 棋盘问题

[NOIP1997 普及组] 棋盘问题

题目背景

NOIP1997 普及组第一题

题目描述

设有一个 N × M N \times M N×M 方格的棋盘 ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) (1≤N≤100,1≤M≤100) (1N100,1M100)

求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。

例如:当 N = 2 , M = 3 N=2, M=3 N=2,M=3 时:

正方形的个数有 8 8 8 个:即边长为 1 1 1 的正方形有 6 6 6 个;边长为 2 2 2 的正方形有 2 2 2 个。

长方形的个数有 10 10 10 个:

  • 2 × 1 2 \times 1 2×1 的长方形有 4 4 4 个:

  • 1 × 2 1 \times 2 1×2 的长方形有 3 3 3 个:

  • 3 × 1 3 \times 1 3×1 的长方形有 2 2 2 个:

  • 3 × 2 3 \times 2 3×2 的长方形有 1 1 1 个:

输入格式

一行两个整数 N , M N,M N,M

输出格式

一行两个整数,表示正方形的个数与长方形的个数。

样例 #1

样例输入 #1
2 3
样例输出 #1
8 10

想法

这道题,可以先数正方形和长方形一共有多少个,再单独数正方形有多少个,最后相减即可算出长方形个数。
第一步:数正方形、长方形总数。我们以 3 × 4 3\times4 3×4棋盘为例:
先看左上角,即第一行第一个,它连接右下方任意格点即可形成一个正方形或长方形。一共 3 × 4 = 12 3\times4=12 3×4=12个选择。
再处理第二个点,一共 2 × 4 = 8 2\times4=8 2×4=8个选择。
第3个点,一共 1 × 4 = 4 1\times4=4 1×4=4个选择。
对于第一行第四个点来说,有 0 × 4 = 0 0\times4=0 0×4=0个选择。
到了第二行第一个点,共 3 × 3 = 9 3\times3=9 3×3=9个选择。
第二个点, 2 × 3 = 6 2\times3=6 2×3=6个选择。
后面就不一一列举了,看下面这幅图:

所以,有 3 × 4 + 2 × 4 + 1 × 4 + 3 × 3 + 2 × 3 + 1 × 3 + 3 × 2 + 2 × 2 + 1 × 2 + 3 × 1 + 2 × 1 + 1 × 1 = 60 3\times4+2\times4+1\times4+3\times3+2\times3+1\times3+3\times2+2\times2+1\times2+3\times1+2\times1+1\times1=60 3×4+2×4+1×4+3×3+2×3+1×3+3×2+2×2+1×2+3×1+2×1+1×1=60个正方形和长方形。
由特殊到一般,对于大小为 x × y x\times y x×y的棋盘,正方形与长方形共有:

t = x y + x ( y − 1 ) + x ( y − 2 ) + ⋯ + x × 1 + ( x − 1 ) y + ( x − 1 ) ( y − 1 ) + ⋯ + ( x − 1 ) × 1 + ⋯ + 1 × 1 = [ x + ( x − 1 ) + ( x − 2 ) + ⋯ + 1 ] [ y + ( y − 1 ) + ( y − 2 ) + ⋯ + 1 ] = x ( x + 1 ) 2 × y ( y + 1 ) 2 = x y ( x + 1 ) ( y + 1 ) 4 \begin{aligned} &t=xy+x(y-1)+x(y-2)+\cdots+x\times1+(x-1)y+(x-1)(y-1)+\cdots+(x-1)\times1+\cdots+1\times1 \\&=[x+(x-1)+(x-2)+\cdots+1][y+(y-1)+(y-2)+\cdots+1] \\&=\frac{x(x+1)}{2}\times\frac{y(y+1)}{2} \\&=\frac{xy(x+1)(y+1)}{4} \end{aligned} t=xy+x(y1)+x(y2)++x×1+(x1)y+(x1)(y1)++(x1)×1++1×1=[x+(x1)+(x2)++1][y+(y1)+(y2)++1]=2x(x+1)×2y(y+1)=4xy(x+1)(y+1)

OK,现在只数正方形。还是以 3 × 4 3\times4 3×4棋盘为例:
先是最小的 1 × 1 1\times1 1×1正方形:共 3 × 4 3\times4 3×4个。
再是 2 × 2 2\times2 2×2正方形,共 2 × 3 = 6 2\times3=6 2×3=6个。
3 × 3 3\times3 3×3正方形: 1 × 2 = 2 1\times2=2 1×2=2
由于的棋盘最短边为 3 3 3,所以不可能再有 4 × 4 4\times4 4×4正方形。因此最大正方形的边长取决于棋盘最短边。
综上,共 3 × 4 + 2 × 3 + 1 × 2 = 20 3\times4+2\times3+1\times2=20 3×4+2×3+1×2=20个正方形。再由特殊推广到一般,对于大小为 x × y x\times y x×y的棋盘:令 k = m i n { x , y } k=min\{x,y\} k=min{x,y},其中 m i n { x , y } min\{x,y\} min{x,y}代表取 x , y x,y x,y中的最小值。
正方形的个数为:
s = x y + ( x − 1 ) ( y − 1 ) + ( x − 2 ) ( y − 2 ) + ⋯ + ( x − k ) ( y − k ) = x y + x y − x − y + 1 2 + x y − 2 x − 2 y + 2 2 + ⋯ + x y − k x − k y + k 2 = ( k + 1 ) x y − ( 1 + 2 + ⋯ + k ) ( x + y ) + ( 1 2 + 2 2 + 3 2 + ⋯ + k 2 ) = ( k + 1 ) x y − k ( k + 1 ) 2 ( x + y ) + ∑ i = 1 k i 2 = ( k + 1 ) x y − k ( k + 1 ) ( x + y ) 2 + k ( k + 1 ) ( 2 k + 1 ) 6 \begin{aligned} &s=xy+(x-1)(y-1)+(x-2)(y-2)+\cdots+(x-k)(y-k)\\ &=xy+xy-x-y+1^2+xy-2x-2y+2^2+\cdots+xy-kx-ky+k^2\\ &=(k+1)xy-(1+2+\cdots+k)(x+y)+(1^2+2^2+3^2+\cdots+k^2)\\ &=(k+1)xy-\frac{k(k+1)}{2}(x+y)+\sum^k_{i=1}i^2\\ &=(k+1)xy-\frac{k(k+1)(x+y)}{2}+\frac{k(k+1)(2k+1)}{6} \end{aligned} s=xy+(x1)(y1)+(x2)(y2)++(xk)(yk)=xy+xyxy+12+xy2x2y+22++xykxky+k2=(k+1)xy(1+2++k)(x+y)+(12+22+32++k2)=(k+1)xy2k(k+1)(x+y)+i=1ki2=(k+1)xy2k(k+1)(x+y)+6k(k+1)(2k+1)

实现

  1. 输入。
  2. 根据刚才的公式直接代数据。
  3. 输出。

题解

C++

#include<iostream>
using namespace std;
int main(){int x,y;cin >> x >> y; //输入int k = min(x,y); //套公式int s = (k + 1) * x * y - k * (k + 1) * (x + y) / 2 + k * (k + 1) * (2 * k + 1) / 6; //正方形int t = (x + 1) * (y + 1) * x * y / 4; //正方形与长方形总数cout << s << ' ' << t - s; //输出return 0;
}

Python

x,y = input().split()
x = int(x)
y = int(y)
k = min(x,y)
s = (k + 1) * x * y - k * (k + 1) * (x + y) / 2 + k * (k + 1) * (2 * k + 1) / 6 #正方形
t = (x + 1) * (y + 1) * x * y / 4 #正方形与长方形总数
print(int(s),int(t - s)) #输出

难度

难度:★★☆☆☆
这道题还是有点难的,虽然放在第一题,但要想写出一个完美的程序还是需要推出公式,说白了这就是道数学题。等到公式推出来了,甚至连判断、循环语句都不需要了,代码简洁得很啊。

结尾

这道题你是怎么AC的?欢迎讨论哦!我们下期再见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客C++刷题记录

C 运算符优先级 运算符优先级顺口溜&#xff1a;淡云一笔&#xff0c;鞍落三服。 淡&#xff1a;单目运算符&#xff1b; 云&#xff1a;算数运算符&#xff1b; 一&#xff1a;移位运算符&#xff1b; 笔&#xff1a;比较运算符&#xff1b; 鞍&#xff1a;按位运算符&a…

MySQL高级-MVCC-undo log 版本链

文章目录 1、undo log2、undo log 版本链2.1、然后&#xff0c;有四个并发事务同时在访问这张表。2.1.1、修改id为30记录&#xff0c;age改为32.1.2、修改id为30记录&#xff0c;name改为A32.1.3、修改id为30记录&#xff0c;age改为10 2.2、总结 1、undo log 回滚日志&#xf…

文件系统(操作系统实验)

实验内容 &#xff08;1&#xff09;在内存中开辟一个虚拟磁盘空间作为文件存储器&#xff0c; 在其上实现一个简单单用户文件系统。 在退出这个文件系统时&#xff0c;应将改虚拟文件系统保存到磁盘上&#xff0c; 以便下次可以将其恢复到内存的虚拟空间中。 &#xff08;2&…

算法训练(leetcode)第二十一天 | 93. 复原 IP 地址、78. 子集、90. 子集 II

刷题记录 93. 复原 IP 地址78. 子集90. 子集 II 93. 复原 IP 地址 leetcode题目地址 题目有一个很重要的要求&#xff1a;你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。 也就是说ip地址中需要包含整个字符串中的字符且顺序不可变。 ip地址的每一个数…

数字孪生煤矿智能化综合管控平台

煤矿可视化通过图扑 HT 实现实时数据集成和三维建模仿真&#xff0c;呈现井下环境、设备状态和生产状况等多维度数据&#xff0c;帮助管理人员进行直观监控和精准分析。该技术提升了运营效率和安全水平&#xff0c;为煤矿作业提供了智能化的管理解决方案&#xff0c;有助于减少…

黑马点评DAY1|Redis入门、Redis安装

什么是Redis&#xff1f; redis是一种键值型数据库&#xff0c;内部所存的数据都是键值对的形式&#xff0c;例如&#xff0c;我们可以把一个用户数据存储为如下格式&#xff1a; 键值id$1600name张三age21 但是这样的存储方式&#xff0c;数据会显得非常松散&#xff0c;因…

云计算HCIE+RHCE学员的学习分享

大一下学期&#xff0c;我从学长嘴里了解到誉天教育&#xff0c;当时准备考RHCE&#xff0c;我也了解了很多培训机构&#xff0c;然后学长强烈给我推荐誉天&#xff0c;我就在誉天报名了RHCE的课程。 通过杨峰老师的教学&#xff0c;我学到了许多Linux知识&#xff0c;也了解了…

笔记本电脑部署VMware ESXi 6.0系统

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统&#xff08;Windows 11升级不了&#xff1f;但Win10就要停服了啊&#xff01;来&#xff0c;我教你&#xff01;&#xff09;&#xff0c;也介绍了…

【单片机毕业设计选题24037】-基于STM32的电力系统电力参数无线监控系统

系统功能: 系统上电后&#xff0c;OLED显示“欢迎使用电力监控系统请稍后”&#xff0c;两秒后显示“Waiting..”等待ESP8266初始化完成&#xff0c; ESP8266初始化成功后进入正常页面显示&#xff0c; 第一行显示电压值&#xff08;单位V&#xff09; 第二行显示电流值&am…

Java 使用Objects equals 、 != 、equals 比较对象之间的区别?

在Java中&#xff0c;比较对象是否相等的方法主要有三种&#xff1a;Objects.equals() 方法、! 操作符和 equals() 方法。它们之间的区别如下&#xff1a; Objects.equals() 方法&#xff1a; Objects.equals(a, b) 是一个静态方法&#xff0c;用于安全地比较两个对象是否相等。…

FastAPI中的Lifespan和异步上下文管理器:深入理解和实践

FastAPI中的Lifespan和异步上下文管理器&#xff1a;深入理解和实践 FastAPI中的Lifespan和异步上下文管理器&#xff1a;深入理解和实践1. 代码解析2. 异步上下文管理器2.1 什么是异步上下文管理器&#xff1f;2.2 asynccontextmanager装饰器2.3 代码示例 3. FastAPI的Lifespa…

现代信息检索笔记(一)

目录 什么是信息检索 应用一&#xff1a;做搜索引擎 应用二&#xff1a;信息推荐系统 应用三&#xff1a;婚恋网站 信息检索的具体应用 从信息规模上分类 为什么要学习信息检索技术&#xff1f; 市场发展需求大 应用需求多&#xff1a; 课程情况 课程宗旨 国际著名…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越&#xff0c;也能承认自己平庸&#xff0c;不要低估3&#xff0c;5&#xff0c;10年沉淀的威力 hi 大家好&#xff0c;我是大师兄&#xff0c;大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间&#xff0c;不太可能一蹴而就&…

使用 FastAPI 实现聊天完成 API 详解

使用 FastAPI 实现聊天完成 API 详解 简介基础概念FastAPIPydanticPyTorch 代码详解1. 定义 API 端点2. 请求验证3. 生成参数字典4. 处理流式响应5. 工具调用处理6. 非流式响应处理7. 处理使用信息和工具调用8. 构建聊天消息9. 构建响应选择10. 更新使用信息11. 返回最终响应 总…

SQL Server触发器深度解析:数据完整性的守护者

标题&#xff1a;SQL Server触发器深度解析&#xff1a;数据完整性的守护者 摘要 在SQL Server中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在特定数据库事件发生时自动执行。触发器主要用于维护数据的完整性和实施复杂的业务规则。本文将详细介绍SQL Server中触…

ubuntu 添加PATH

在Ubuntu中&#xff0c;PATH是一个环境变量&#xff0c;用于指定系统查找可执行文件的目录列表。如果你想将新的目录添加到PATH中&#xff0c;可以按照以下步骤操作&#xff1a; 临时添加PATH 你可以在终端中使用export命令临时修改PATH环境变量。例如&#xff0c;如果你想将…

Python使用彩虹表来尝试对MD5哈希进行破解

MD5是一种散列算法&#xff0c;它是不可逆的&#xff0c;无法直接解密。它的主要作用是将输入数据进行散列&#xff0c;生成一个固定长度的唯一哈希值。 然而&#xff0c;可以使用预先计算好的MD5哈希值的彩虹表&#xff08;Rainbow Table&#xff09;来尝试对MD5进行破解。彩…

c++函数(一)习题讲解

1.【单选题】 void swap (int a,int b) { a a ^ b; b a ^ b; a a ^ b; } int a {120},b {130}; swap{a,b}; a? b? A 120,130 B 130,120 C130,0 解析&#xff1a;这道题中&#xff0c;函数体的内容是交换两个变量的值&#xff0c;采用的是位运算的…

Java中泛型的概念和使用场景

技术难点 Java中的泛型&#xff08;Generics&#xff09;是JDK 5.0引入的一项新特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff08;type parameters&#xff09;。泛型的主要技术难点在于类型擦除&#xff08;type erasure&#xff09;和类型推断&#xf…

Day48

Day48 手写Spring-MVC之前后置处理器与异常处理 前后置处理器 概念&#xff1a;从服务器获取的JSON数据可能是加密后的&#xff0c;因此服务端获取的时候需要进行解密&#xff08;前置处理器&#xff09;。 而从服务器传出的JSON数据可能需要加密&#xff0c;因此需要在处理返…