题目

四平方和

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

比如:
5 = 02 + 02 + 12 + 22
7 = 12 + 12 + 12 + 22
(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:
5
则程序应该输出:
0 0 1 2

再例如,输入:
12
则程序应该输出:
0 2 2 2

再例如,输入:
773535
则程序应该输出:
1 1 267 838

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

Ideas

首先,因为n = a2 + b2 + c2 + d2,所以 a,b,c,d<na,b,c,d < \sqrt{n}a,b,c,d<n​。

然后因为N<5000000,所以我们必须要保证算法的时间复杂度在O(nlogn)以内。

所以四层暴力循环肯定会超时的,对于n\sqrt{n}n​的循环我们最多只能有两层。

那么我们就想怎么能把四层循环拆成两层,然后还得保证算法的时间复杂度在O(nlogn)以内。

对于n\sqrt{n}n​的循环我们最多只能有两层,也就是说循环的时间复杂度就达到了O(n),符合小于O(nlogn)的限制。

那么怎么拆成两个循环呢?

前两个循环:我们可以先枚举两个比较大的数c和d,然后把所有c2+d2c^{2} + d^{2}c2+d2的结果都存储到一个哈希表中,key就是c2+d2c^{2} + d^{2}c2+d2,value就是(c, d)。

后两个循环:枚举a和b,然后我们判断num−(a2+b2)num - (a^{2} + b^{2})num−(a2+b2)的结果是否在集合中,如果在的话,那就说明我们找到了答案。

Code

Python

def solve(num):hash_table = dict()for c in range(int(num ** 0.5) + 1):for d in range(c, int(num ** 0.5) + 1):  # d可以从c开始枚举val = c ** 2 + d ** 2if not hash_table.get(val, None):hash_table[val] = f"{c} {d}"for a in range(int(num ** 0.5) + 1):for b in range(a, int(num ** 0.5) + 1):val = hash_table.get(num - a ** 2 - b ** 2)if val:print(f"{a} {b} {val}")returnif __name__ == '__main__':solve(int(input()))

在线评测:https://www.acwing.com/problem/content/1223/

2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - H. 四平方和相关推荐

  1. 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - B. 生日蜡烛

    生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始过生日par ...

  2. 2016年第七届蓝桥杯 - 国赛 - C/C++大学B组 - D. 机器人塔

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A ...

  3. 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - I. 密码脱落

    题目 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其中许 ...

  4. 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - F. 寒假作业

    题目 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果显示不出来,可以参见[图7-1.jpg]) 每个方 ...

  5. 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - A. 网友年龄

    题目 某君新认识一网友. 当问及年龄时,他的网友说: "我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄" 请你计算:网友的年龄一共有 ...

  6. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - H.移动距离

    移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列. 其楼房的编号为1,2,3- 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 ...

  7. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - H. 等差数列

    [问题描述] 数学老师给小明出了一道等差数列求和的题目. 但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数. 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项? [输 ...

  8. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - H. 饮料换购

    饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账). 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对 ...

  9. 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解

    第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...

最新文章

  1. C++ break语句,continue语句,goto语句
  2. python数字图像的行 宽的不同处 cv2.resize(1389,1500) p1列宽 p2 行高 stop2.shape 得(640,960,3) v1列宽 v2 行高 v3 通道数
  3. Android利用Looper在子线程中改变UI
  4. jenkins的安装
  5. 【网址收藏】华为荣耀V9(DUK-AL20)刷机包下载
  6. 【python】人机大战
  7. 运行HelloJersey遇到异常解决方法
  8. 2020-12-16子类对象指针强转成父类对象指针,父类对象指针调用子类函数问题(待整理)
  9. hduoj 1518square
  10. The Beauty of DirectX 11 (3) --- constant buffer, buffered/structure buffer
  11. 关于校企合作的一些想法和思路
  12. 重庆APP开发价格费用如何计算?
  13. 【IDEA】 弹出Server's certificate is not trusted 解决方法
  14. 大二数据库实验报告答案
  15. 自动抓取app数据的攻与防
  16. 阿里年薪50WJAVA工程师转大数据学习路线!
  17. FHQ Treap 总结
  18. Can't connect to Mysql server on .....(10038)的解决办法
  19. MYSQL正则匹配手机号码
  20. HC?OC?这些校招黑话你看明白了吗?

热门文章

  1. Codeforces 285E Positions in Permutations dp + 容斥原理
  2. BZOJ 4710: [Jsoi2011]分特产
  3. 我们越来越浮躁的心靠什么去滋润
  4. 代码优化Android ListView适配器三级优化详解
  5. Nginx——事件驱动机制(雷霆追风问题,负载均衡)
  6. iphone/ipad图标尺寸
  7. 【More Effective C#】LINQ表达式与方法调用的映射
  8. markdown mysql高亮_修改博客园markdown编辑器代码高亮风格的方法
  9. 奇安信cdn配置教程_PicGo+jsDelivr+GitHub搭建免费cdn加速的图床
  10. Java黑皮书课后题第1章:1.1(显示三条消息)编写程序,显示Welcome to Java、Welcome to Computer Science和Programming is fun