news 2026/10/19 2:07:09

122. 2016年蓝桥杯省赛 - 四平方和(困难)- 暴力枚举

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
122. 2016年蓝桥杯省赛 - 四平方和(困难)- 暴力枚举

122. 四平方和(暴力枚举)

2016年蓝桥杯省赛 - 四平方和(困难)

标签:2016省赛暴力枚举

题目描述

四平方和定理,又称拉格朗日定理:每个正整数都可以表示为至多 4 个正整数的平方和。把 0 也算进去,就正好可以表示为 4 个数的平方和,比如

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

7=12+12+12+22 7 = 1^2 + 1^2 + 1^2 + 2^27=12+12+12+22

一个正整数可能存在多种表示法。要求把 4 个数排序为0≤a≤b≤c≤d0 \le a \le b \le c \le d0≤a≤b≤c≤d,并把所有表示法按a,b,c,da, b, c, da,b,c,d为联合主键升序排列,输出排在最前面的那一组。

输入描述

一个正整数NNN(N<5000000N < 5000000N<5000000)。

输出描述

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

输入输出样例

示例 1:

输入

5

输出

0 0 1 2

示例 2:

输入

12

输出

0 2 2 2

示例 3:

输入

773535

输出

1 1 267 838

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

解题思路

四个数要满足a2+b2+c2+d2=Na^2 + b^2 + c^2 + d^2 = Na2+b2+c2+d2=N,并且0≤a≤b≤c≤d0 \le a \le b \le c \le d0≤a≤b≤c≤d,输出字典序最小的那一组。

直接四重循环枚举四个数太慢,但注意到:只要a,b,ca, b, ca,b,c定了,ddd也就定了——剩下的部分必须是一个完全平方数。所以先算出

d=⌊N−a2−b2−c2⌋ d = \left\lfloor \sqrt{N - a^2 - b^2 - c^2} \right\rfloord=⌊N−a2−b2−c2​⌋

再回头验证a2+b2+c2+d2=Na^2 + b^2 + c^2 + d^2 = Na2+b2+c2+d2=N就行。这样四重循环直接降成三重。

把NNN看成一条长条就是:a2a^2a2、b2b^2b2、c2c^2c2之外剩下的那截,必须正好等于d2d^2d2,否则这组(a,b,c)(a,b,c)(a,b,c)作废:

枚举时每一层都从上一个数开始(b≥ab \ge ab≥a、c≥bc \ge bc≥b、d≥cd \ge cd≥c),顺序既不重复也不遗漏;同时用⋅\sqrt{\cdot}⋅​收紧每层的上界,比如给定aaa后bbb最多取到N−a2\sqrt{N - a^2}N−a2​,可以省掉大量不可能的取值。

又因为a,b,c,da, b, c, da,b,c,d是从小到大一层层枚举的,第一组满足等式的解,恰好就是按a,b,c,da, b, c, da,b,c,d升序排在最前面的那组,找到直接返回即可。

以样例773535走一遍:

N = 773535 a=0 整个分支试遍,无解 a=1, b=1 c=1 … 266 剩余部分都不是完全平方数 c=267 剩余 = 773535 - 1 - 1 - 267² = 702244 d = √702244 = 838,且 838 ≥ 267 → 输出 1 1 267 838

代码实现

importmathdefhs(n):am=int(math.sqrt(n))# a 最大值forainrange(am+1):bm=int(math.sqrt(n-a*a))# 给定a后,b的最大值forbinrange(a,bm+1):# 保证 a <= bcm=int(math.sqrt(n-a*a-b*b))# 给定a和b后,c的最大值forcinrange(b,cm+1):# 保证 b <= ct=n-a*a-b*b-c*c# 剩下的部分应等于 d^2d=int(math.sqrt(t))# 计算difd>=canda*a+b*b+c*c+d*d==n:returna,b,c,d n=int(input())print(' '.join([str(x)forxinhs(n)]))

复杂度分析

  • 时间复杂度:O(N3/2)O(N^{3/2})O(N3/2),三层枚举a,b,ca, b, ca,b,c,每层的上界都是N\sqrt{N}N​级别;找到第一组解就返回,实际往往远小于这个上界。
  • 空间复杂度:O(1)O(1)O(1),只用了几个循环变量和临时变量。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 2:06:55

红同电子线束工厂百问百答|传感器线束IP65公母对接装配注意事项

1. 引言传感器线束在工业设备、汽车电子和自动化控制中承担着信号传输的关键作用&#xff0c;而IP65防护等级的公母对接结构&#xff0c;则决定了线束在潮湿、粉尘等恶劣环境下的长期可靠性。上海红同电子有限公司&#xff08;www.hongtongsh.com&#xff09;深耕电子高低压线束…

作者头像 李华
网站建设 2026/10/19 2:06:29

Pip实用命令全解析:从安装到升级一网打尽

#技术派的书架#引言是一个关于包管理的工具, 它最常见的用来安装软件包的用途, 除了这个以外还有一些别的很有用的命令, 这些命令可能很多读者朋友并不怎么清楚, 接下来我们要对它们做个简单的说明。1. 更新 pippython -m pip install --upgrade pip2. 把软件包进行安装, 这个动…

作者头像 李华
网站建设 2026/10/19 2:06:27

OA流程定制全参数概览:一张图看懂流程的“七十二变”

写在前面 流程是OA系统的核心引擎——表单定格式&#xff0c;流程定规则。对于实施人员来说&#xff0c;掌握流程的每一个可配置参数&#xff0c;就等于握住了应对各种复杂业务场景的钥匙。 本文梳理流程定制的全参数体系&#xff0c;帮助实施人员建立整体认知。后续我们将逐…

作者头像 李华
网站建设 2026/10/19 2:06:23

P1011 [NOIP 1998 提高组] 车站

题目链接: P1011 [NOIP 1998 提高组] 车站 - 洛谷 最佳思路: 枚举 #include<bits/stdc.h> using namespace std; int main() {int a,n,m,x;cin >> a >> n >> m >> x;int up[25] {0},down[25] {0},sum[25] {0};up[1] a,down[1] 0,sum[1] …

作者头像 李华
网站建设 2026/10/19 2:06:06

Spring Cloud Gateway实战:路由断言过滤器与限流熔断指南

1. 从一次"接口突然404"说起&#xff1a;为什么需要Spring Cloud Gateway先讲一个我印象很深的场景。某天下午&#xff0c;同事急匆匆跑来说线上某个老接口突然返回404&#xff0c;前端一堆报错。我第一反应是"服务挂了&#xff1f;"结果一看注册中心&…

作者头像 李华
网站建设 2026/10/19 2:05:55

Linux网络配置实战:ip、nmcli、netplan、ifcfg命令

「服务器换机房了&#xff0c;网卡要改成静态 IP」「虚拟机克隆后默认路由不见了」——网络配置是运维最基础也最容易翻车的操作。麻烦在于 Linux 没有统一的配置方式&#xff1a;ip 命令即时生效但重启就丢&#xff1b;netplan、ifcfg、nmcli 各管一派&#xff0c;发行版之间还…

作者头像 李华