洛谷 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.rhkb.cn/news/364608.html

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

相关文章

【Hadoop学习笔记】认识Hadoop

认识Hadoop 从网上找的课程做的笔记&#xff0c;有些图是自己理解画的&#xff0c;可能不正确&#xff0c;可以作为参考&#xff0c;有疑问的地方请直接指出&#xff0c;共同交流。 Hadoop是由Apache基金会开发的一个分布式系统基础架构&#xff0c;主要解决海量数据的存储和海…

不知道自己的优势擅长和兴趣爱好,我该如何填报高考志愿选专业?

天生我才必有用&#xff0c;每个人都是独立的个体&#xff0c;拥有自己的优势和擅长&#xff0c;当然这个优势和擅长&#xff0c;不是和别人对比&#xff0c;而是和自己对比产生的。 如果说你不知道自己的优势擅长&#xff0c;不知道自己的兴趣和爱好&#xff0c;那只不过是你没…

HarmonyOS APP应用开发项目- MCA助手(持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

架构师篇-7、企业安全架构设计及实践

摘要&#xff1a; 认识企业安全架构企业安全案例分析及实践 内容&#xff1a; 为什么做企业安全架构怎么做好安全架构设计案例实践分析&随堂练 为什么要做企业安全架构 安全是麻烦制造者&#xff1f; 整天提安全需求增加开发工作增加运维要求增加不确定性延后业务上线…

【Docker】docker 替换宿主与容器的映射端口和文件路径

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom&#xff08;了解&#xff09;application.propertiessql代码Controller控制层视图service&#xff1a; 服务层mapper&#xff08;dao&#xff09;&#xff1a;持久层entity层(model层&#xff0c;domain层、 bean)&#xff1a;对应数据库表&#xff0c;实体类 效果…

BIM 模型三维展示方式

三维模型展示场景目前主流的使用 threejs ,bably.js 引擎框架作为开发展示&#xff1b;对于特殊的封闭式模型格式需要二次转换处理&#xff1b;今天推荐一款直接将模型碎片化处理方式&#xff0c;同时能够在网页加载速度快&#xff0c;性能也很流畅&#xff0c;先看结果&#x…

llama3模型部署时遇到的问题及解决方案

在llama3模型部署时&#xff0c;会遇到一系列问题&#xff0c;这里就作者所遇到的问题与解决方法分享一下。 注意&#xff1a;这里是从llama3 github主页上给的方法一步步做的&#xff0c;不适用于其他部署大模型的方法。 文章目录 ERROR 403&#xff1a;Forbidden安装依赖时出…

【Python游戏】猫和老鼠

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、代码示例三、知识点梳理四、总结一、前言 本文介绍如何使用Python的海龟画图工具turtle,开发猫和老鼠游戏。 什么是Python? Python是由荷兰人吉多范…

后端之路第三站(Mybatis)——结合案例讲Mybatis怎么操作sql

先讲一下准备工作整体流程要做什么 我们要基于一个员工管理系统作为案例&#xff0c;进行员工信息的【增、删、改、查】 原理就是用Mybatis通过java语言来执行sql语句&#xff0c;来达到【增、删、改、查】 一、准备工作 1、引入数据库数据 首先我们把一个员工、部门表的数…

简述设计模式-工厂模式

概述 工厂模式是为了提供创建对象的方式&#xff0c;无需制定要创建的具体类。 举个例子&#xff0c;假如我是甲方需要制造一辆车&#xff0c;我可以要油车&#xff0c;可以要电车&#xff0c;也可以油电混动车&#xff0c;如果没有工厂&#xff0c;我需要自己找到对应的制造…

机电公司管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;公告管理&#xff0c;考勤管理&#xff0c;请假管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;机电零件…

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇11基于stm32的智能水质检测系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -------------…

独家原创 | Matlab实现CNN-Transformer多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-Transformer多变量时间序列预测&#xff1b; 2.运行环境为Matlab2023b…

英飞凌TC3xx之DMA工作原理及应用实例

英飞凌TC3xx之DMA工作原理及应用实例 1 DMA的架构2 必要的术语解释3 DMA请求3.1 DMA软件请求3.2 DMA硬件请求3.3 DMA 菊花链请求3.4 DMA自动启动请求3.5 总结4 小结DMA是直接存储访问Direct Memory Access的简称。它的唯一职能就是在不需要CPU参与的情况下,将数据从源地址搬运…

计算机Java项目|基于SpringBoot的作业管理系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

【后端面试题】【中间件】【NoSQL】ElasticSearch 节点角色、写入数据过程、Translog和索引与分片

中间件的常考方向&#xff1a; 中间件如何做到高可用和高性能的&#xff1f; 你在实践中怎么做的高可用和高性能的&#xff1f; Elasticsearch节点角色 Elasticsearch的节点可以分为很多种角色&#xff0c;并且一个节点可以扮演多种角色&#xff0c;下面列举几种主要的&…

[C++][设计模式][中介者模式]详细讲解

目录 1.动机2.模式定义3.要点总结 1.动机 在软件构建过程中&#xff0c;经常会出现多个对象相互关联的情况&#xff0c;对象之间常常会维持一种复杂的引用关系&#xff0c;如果遇到一些需求的更改&#xff0c;这种直接的引用关系将面临不断的变化在这种情况下&#xff0c;可以…

python读取语文成绩 青少年编程电子学会python编程等级考试三级真题解析2022年3月

目录 python读取语文成绩 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python读取语文成绩 2022年3月 python编程等级考试级编程题 一、题目…

深入探讨C++的高级反射机制

反射是一种编程语言能力&#xff0c;允许程序在运行时查询和操纵对象的类型信息。它广泛应用于对象序列化、远程过程调用、测试框架、和依赖注入等场景。 由于C语言本身的反射能力比较弱&#xff0c;因此C生态种出现了许多有趣的反射库和实现思路。我们在本文一起探讨其中的奥秘…