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

news2024/11/26 9:40:20

题目

洛谷 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.coloradmin.cn/o/1878937.html

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

相关文章

Vue结合Element UI的el-table打造加工工序甘特图可视化解决方案

引言 在玻璃加工行业&#xff0c;高效管理切割、磨边、洗、钢化、丝印等复杂工序对于提升生产效率至关重要。本文将介绍如何利用Vue.js框架结合Element UI组件库&#xff0c;自定义实现一个工序甘特图&#xff0c;以可视化展示各道工序的时间线与进度&#xff0c;为生产调度带…

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

浅谈一下VScode如何配置C环境

1.这几天突然发现在VScode写C程序比在DevC效果更好&#xff0c;因为在VScode中写代码有代码补全功能。所以我突然对在VScode中配置C环境变量产生了兴趣。 2.不过在VScode中配置C环境要是按照官方的来配置有点麻烦。 3.我这里有一个直接配置VScode中C环境变量的应用。 前提是…

K8S 集群节点缩容

环境说明&#xff1a; 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233&#xff08;需下线&#xff09;192.168.99.2332C4Gwoker1.23.1720.10.24 1. K8S 集群节点缩容 当集群中有…

8.12 矢量图层面要素单一符号使用十一(短划线渲染边界)

前言 本章介绍矢量图层线要素单一符号中短划线渲染边界的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 短划线渲染边界&#xff08;Outline: Hashed Line&#xff09; Outline系列只画边界&#xff0c;不填充内容以protected_areas.shp为例&#x…

羊了个羊:羊、羊、羊

一、I am me&#xff0c;羊羊羊 英文中的 我就是我&#xff08;I am me&#xff09;&#xff0c;其实就是&#xff1a;羊 羊 羊&#xff0c;为什么会有这么一个结论呢&#xff1f; 请往下看&#xff1a; I&#xff0c;就是羊 am&#xff08;是&#xff09;&#xff0c;也是羊 …

2-20 基于matlab的利用准二维发散喷嘴的特性法给出理想喷嘴的几何形状

基于matlab的利用准二维发散喷嘴的特性法给出理想喷嘴的几何形状。 假设气体从燃烧室排出&#xff0c;燃烧室内没有质量流量。 利用二维喷嘴流动关系&#xff0c;找到一个最佳喉管区域&#xff0c;该区域将在给定环境压力和燃烧室参数下产生最大推力。 该区域将自动设置并输入代…

【Verilog HDL-1】基本、向量、模块

HDL习题 1 阻塞型赋值‘’与非阻塞型赋值‘<’ 阻塞型赋值 b a ba ba&#xff1a;适用于纯组合电路 非阻塞型赋值 b < a b<a b<a&#xff1a;适用与时序逻辑电路 2 wire线型,assign连续赋值 wire a,b,c; assign b a; assign c a;与编程语言不同&#xff…

SpringDataJPA系列(2)Commons核心Repository

SpringDataJPA系列(2)Commons核心Repository Spring Data Commons依赖关系 我们通过 Gradle 看一下项目依赖&#xff0c;了解一下 Spring Data Common 的依赖关系 通过上图的项目依赖&#xff0c;不难发现&#xff0c;数据库连接用的是 JDBC&#xff0c;连接池用的是 HikariC…

Orangepi Zero2使用外设驱动库wiringOP配合定时器驱动SG90舵机

目录 一、舵机的基本认知和硬件接线 1.1 舵机的基本认知&#xff1a; 1.2 硬件接线&#xff1a; 1.3 怎么控制舵机旋转不同的角度&#xff1a; 二、Linux定时器 2.1 定时器setitimer()函数原型和头文件&#xff1a; 2.2 信号处理函数signal()原型和头文件&#xff1a; 2…

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

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

【C语言】指针剖析(2)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 一、数组名1.概念2.sizeof和&里面的数组名sizeof& 二、使用指针访问数组三、一维数组传参本质四、指针数组1.概念实例&#xff08;模拟二维数…

【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发

文章目录 一、效果展示二、简介三、安装Jib插件1、区分环境2、安装插件一、效果展示 本地是window系统,无docker环境,没有任何runtime,使用jib工具打包镜像并推送完成,用时20秒 二、简介 Jib 是 Google 开发的一款开源工具,旨在帮助 Java 开发者更高效地将 Java 应用程…

25届近5年北京交通大学自动化考研院校分析

北京交通大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…

vue使用scrollreveal和animejs实现页面滑动到指定位置后再开始执行动画效果

效果图 效果链接&#xff1a;http://website.livequeen.top 介绍 一、Scrollreveal ScrollReveal 是一个 JavaScript 库&#xff0c;用于在元素进入/离开视口时轻松实现动画效果。 ScrollReveal 官网链接&#xff1a;ScrollReveal 二、animejs animejs是一个好用的动画库…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

【自然资源】国家历史文化名城你知道多少?

【自然资源】国家历史文化名城你知道多少&#xff1f; 中国五千年的历史孕育出了一些因深厚的文化底蕴和发生过重大历史事件而青史留名的城市。根据《中华人民共和国文物保护法》&#xff0c;“历史文化名城”是指保存文物特别丰富&#xff0c;具有重大历史文化价值和革命意义…

数据恢复篇: 如何在数据丢失后恢复照片

数据丢失的情况并不少见。如果您曾经遇到过图像丢失的情况&#xff0c;您可能想过照片恢复工具是如何工作的&#xff1f;可能会丢失多少数据图像&#xff1f;即使是断电也可能导致照片和媒体文件丢失。 话虽如此&#xff0c;如果你认为删除的照片无法恢复&#xff0c;那你就错…

sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理

目录 搭建hadoop 下载hadoop JAVA 下载bin windows 改环境变量 将winutils.exe和hadoop.dll放到C:\Windows\System32下&#xff0c;然后重启 修改配置 vim core-site.xml vim hdfs-site.xml hadoop-env.sh mapred-site.xml yarn-site.xml 格式化命令 启动集群 …

大数据可视化实验(七):Python数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;绘制带颜色的柱状图。.. 1 2&#xff09;绘制堆叠柱状图。.. 3 3&#xff09;绘制数学函数曲线图。.. 4 4&#xff09;使用seaborn绘制组合图形。... 5 5&#xff09;使用Boken绘制多个三角形…