每日算法打卡:四平方和 day 9

文章目录

    • 原题链接
    • 题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例:
        • 输出样例:
    • 题目分析
    • 示例代码
      • 二分
      • 哈希
    • 注意

原题链接

1221. 四平方和

题目难度:简单

题目来源:第七届蓝桥杯省赛C++ A/B组,第七届蓝桥杯省赛Java B/C组

题目描述

四平方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多 4 个正整数的平方和。

如果把 0 包括进去,就正好可以表示为 4 个数的平方和。

比如:

5 = 0 2 + 0 2 + 1 2 + 2 2 5 = 0^2 + 0^2 + 1^2 + 2^2 5=02+02+12+22
7 = 1 2 + 1 2 + 1 2 + 2 2 7 = 1^2 + 1^2 + 1^2 + 2^2 7=12+12+12+22

对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对 4 个数排序:

0 ≤ a ≤ b ≤ c ≤ d 0 \le a \le b \le c \le d 0abcd

并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。

输入格式

输入一个正整数 N。

输出格式

输出4个非负整数,按从小到大排序,中间用空格分开。

数据范围

0 < N < 5 ∗ 1 0 6 0 < N < 5 * 10^6 0<N<5106

输入样例:
5 
输出样例:
0 0 1 2 

题目分析

这道题的内容比较简洁,就是将一个整数分成四个整数的平方和的形式,有很多做法

我们可以大概分析一下,因为N是分成一个平方的,而 5 ∗ 1 0 6 ≈ 2300 \sqrt{5*10^6} \approx 2300 5106 2300,那么我们最多就枚举两个数,否则就会超过时间限制

这道题有四个未知量,但实际上只需要枚举三个数,第四个数字是可以算出来的

这里就用到一个常用的思想,用空间换时间,我们本来是要枚举第三重循环

现在我们只枚举c和d,将 c 2 + d 2 c^2+d^2 c2+d2存起来,之后再枚举a和b,对于每一个我们枚举的a和b,都可以计算出 t = n − a 2 − b 2 t = n-a^2-b^2 t=na2b2,我们只需要判断这个t是否在之前存的数组中出现过即可,如果出现过,则找到了一组解

那么我们如何快速的判断一个数是否在数组中出现过,一种做法就是使用哈希,另一种就是使用二分的做法

示例代码

二分

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;const int N = 2500010;struct Sum
{int s, c, d;bool operator<(const Sum& t) const // 小于号重载,用于排序{if (s != t.s) return s < t.s;if (c != t.c) return c < t.c;return d < t.d;}
}sum[N];int n, m;// m表示存下了多少个sint main()
{cin >> n;// 枚举s,记录此时的c和dfor (int c = 0; c * c <= n; c++)for (int d = c; c * c + d * d <= n; d++)sum[m++] = { c * c + d * d,c,d };// 排序sort(sum, sum + m);// 枚举a和bfor (int a = 0; a * a <= n; a++)for (int b = a; a * a + b * b <= n; b++){int t = n - a * a - b * b;// 二分查找表中是否有tint l = 0, r = m - 1;while (l < r){int mid = (l + r) / 2;if (sum[mid].s >= t)r = mid;elsel = mid + 1;}if (sum[l].s == t){printf("%d %d %d %d\n", a, b, sum[l].c, sum[l].d);return 0;}}return 0;
}

哈希

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<unordered_map>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;const int N = 2500010;
int n;
unordered_map<int, PII> S; // 记录字典序最小的c和dint main()
{cin >> n;// 枚举s,记录最小的c和dfor (int c = 0; c * c <= n; c++)for (int d = c; c * c + d * d <= n; d++){int t = c * c + d * d;if (S.count(t) == 0)S[t] = { c,d };}// 枚举a和bfor (int a = 0; a * a <= n; a++)for (int b = a; a * a + b * b <= n; b++){int t = n - a * a - b * b;if (S.count(t)){printf("%d %d %d %d\n", a, b, S[t].x, S[t].y);return 0;}}return 0;
}

注意

  1. 如果直接使用库中的哈希表是会超时的,需要自己手搓哈希表

  2. 这里存在一个隐性问题,就是如何保证我们枚举的顺序是字典序最小的

    首先,我们观察枚举的顺序,可以确保 a < b , c < d a<b,c<d a<b,c<d一定是成立的,其次我们在枚举的时候,对于a和b是小到大枚举的,这时算出来的 t = n − a 2 − b 2 t=n-a^2-b^2 t=na2b2是从大到小的顺序,也就是查询是否存在时是从大到小查的,假设存在对应的t,那么对于 t = c 2 + d 2 t=c^2+d^2 t=c2+d2就可以保证c和d是尽可能的大了

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

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

相关文章

usb转32串口方案

方案结构图 使用usb hub芯片扩展4路usb然后再一分八路串口 USB hub 选择hub芯片注意事项&#xff1a; 目前市场上多数的USB 2.0 Hub芯片,只有内建一个Transaction Translators(STT)&#xff0c;因此 当Hub接收到如Full Speed的装置进入时&#xff0c;12Mbps的「单一」信道…

python读取csv表格数据,生成折线图

生成一个python类&#xff0c;主要解决问题&#xff0c;读取csv表格中的数据&#xff0c;生成一个折线图。 输入原数据文件路径&#xff0c;例如&#xff1a; test.csv按顺序输入需要使用到的数据列&#xff0c;例如&#xff1a;1,2,3会将输入的第一列作为X轴&#xff0c;其他…

到了一个公司怎么发挥自己的价值呢?

本文仅凭借个人所经历过的公司展开论述&#xff0c;每个公司不尽相同&#xff0c;如有歧义可自由发言 一个团队干的时间久了&#xff0c;业务能总览大局&#xff0c;如果用户量迟迟没有暴增&#xff0c;业务没有拓展&#xff0c;技术想必也不会有较大的更新。团队日常工作处理游…

使用Moonbuilders Academy平台,学习DApp开发

Moonbeam团队于2022年宣布开放Moonbuilders Academy。这是一套以开发为中心的异步学习课程&#xff0c;用于学习如何在Moonbeam上构建跨链DApp。 如何从官网进入平台&#xff1f; 点击http://moonbeam.network 鼠标移动至 “Builders”&#xff0c;在Resources下方选择“Moo…

2024腾讯爱奇艺首发片单,谁能率先拿下开年爆款?

刚进入2024年&#xff0c;头部长视频平台就开启了新一轮“内卷”。 腾讯和爱奇艺不约而同地在2024年的第一天发布了新剧片单&#xff0c;多部高质量精品大剧蓄势待发&#xff0c;点燃了观众和市场的期待。 2023年之争已经落下帷幕&#xff0c;爱奇艺凭借大爆剧《狂飙》拔得头…

Next City 数都上海应用创新大赛结果公布,子虔科技获奖

12月16日&#xff0c;以“应变求机 以数谋新”为主题的上海城市数字化转型体验周举办。作为上海城市数字化转型年终重磅活动&#xff0c;上海市人民政府副秘书长庄木弟&#xff0c;市经济和信息化工作党委书记程鹏&#xff0c;杨浦区委副书记、区长周海鹰&#xff0c;市经济和信…

Apache ActiveMQ 远程代码执行漏洞分析

漏洞简介 Apache ActiveMQ官方发布新版本&#xff0c;修复了一个远程代码执行漏洞&#xff0c;攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行&#xff0c;从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …

统信UOS虚拟机安装VirtualBox扩展使用USB功能

为什么要安装VirtualBox扩展包&#xff1f; 安装 Oracle VM VirtualBox 扩展包的原因是&#xff0c;它提供了对 USB 2.0、USB 3.0、远程桌面协议 VRDP&#xff08;VirtualBox Remote Desktop Protocol&#xff09;等实用功能的支持&#xff0c;以增强 VirtualBox 的功能。这些…

HarmonyOS 应用开发学习笔记 ets组件生命周期

HarmoryOS Ability页面的生命周期 Component自定义组件 ets组件生命周期官放文档 本文讲解 ets组件的生命周期&#xff0c;在此之前大家可以先去了解Ability的生命周期&#xff0c;这两个生命周期有有一定的关联性 在开始之前&#xff0c;我们先明确自定义组件和页面的关系&…

Redis之集群脑裂

redis集群没有过半机制会有脑裂问题&#xff0c;网络分区导致脑裂后多个主节点对外提供写服务&#xff0c;一旦网络分区恢复&#xff0c;会将其中一个主节点变为从节点&#xff0c;这时会有大量数据丢失。 规避方法可以在redis配置里加上参数&#xff08;这种方法不可能百分百…

系列八、面向对象

一、面向对象 1.1、面向对象 vs 面向过程 &#xff08;1&#xff09;面向对象是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物&#xff1b; &#xff08;2&#xff09;面向过程是一种以过程为中心的编程思想。这些都是以什么正在发生为主…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷&#xff0c;但现有研究成果主要集中在财务业务单一领域&#xff0c;缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理&#xff0c;无论从自身技术发展&#xff0c;或…

常见的Latex公式所用到的内容汇总

行内公式 f ( x ) a b f(x)ab f(x)ab 左右各加一个$&#xff0c;即为行内公式 $ f(x) ab $行间公式 $$ f(x) ab $$f ( x ) a b f(x)ab f(x)ab 手动编号 $$ f(x) a - b \tag{1.1} $$f ( x ) a − b (1.1) f(x)a-b \tag{1.1} f(x)a−b(1.1) 简单运算 -*/以及阿拉伯…

为什么大型服务器要用 Linux 系统?

为什么大型服务器要用 Linux 系统&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff…

创新百喻,综合性思维和分析性思维

创新百喻&#xff0c;综合性思维和分析性思维 不知道您注意没有&#xff0c;在创新中&#xff0c;人们的思维方式是不一样的&#xff0c;有综合性思维和分析性思维之分。总的来说&#xff0c;综合性思维适合创造原来没有的事物&#xff0c;而分析性思维擅长改进和提高&#xf…

element plus: el-upload详解

<el-uploadref"uploadRef":limit"1" // 上传几个accept".xlsx, .xls" // 支持的格式:headers"headers" :action"http//:shangchuan.com":disabled"state.upload.isUploading":before-upload"onBeforeUpl…

Java Spring boot 日期和时间统一设置

方法一&#xff1a;配置文件修改 修改配置文件配置application.yml&#xff1a; spring:# 配置日期格式化jackson:date-format: yyyy-MM-dd HH:mm:ss #时间戳统一转换为指定格式time-zone: GMT8 # 时区修改为东8区 application.properties配置方式 spring.jackson.date-f…

两周掌握Vue3(一):安装、打包、目录结构

文章目录 一、安装1.安装node.js和npm&#xff08;windows&#xff09;2.安装vue&#xff0c;创建vue项目报错&#xff1a;XXX不是内部或外部命令 二、打包三、目录结构 nodejs版本&#xff1a;v20.10.0 npm版本&#xff1a;v10.2.3 一、安装 1.安装node.js和npm&#xff08;…

安科瑞电气防火限流式保护器与电动汽车充电桩的搭配使用——安科瑞 顾烊宇

摘要&#xff1a;随着电动汽车行业的不断发展&#xff0c;电动汽车充电设施的使用会变得越来越频繁和广泛。根据中汽协数据显示&#xff0c;2022年上半年&#xff0c;我国新能源汽车产销分别完成266.1万辆和260万辆,同比均增长1.2倍,市场渗透率达21.6%。因此&#xff0c;电动汽…

bool和BOOL的区别

简介 在编程中&#xff0c;bool&#xff08;以小写形式&#xff09;和BOOL&#xff08;以大写形式&#xff09;是两个不同的数据类型。bool是C和C#等语言中的基本数据类型&#xff0c;它表示一个布尔值&#xff0c;可以是true&#xff08;真&#xff09;或false&#xff08;假…