2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - H. 四平方和
题目
四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多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. 四平方和相关推荐
- 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - B. 生日蜡烛
生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始过生日par ...
- 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 ...
- 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - I. 密码脱落
题目 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其中许 ...
- 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - F. 寒假作业
题目 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果显示不出来,可以参见[图7-1.jpg]) 每个方 ...
- 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - A. 网友年龄
题目 某君新认识一网友. 当问及年龄时,他的网友说: "我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄" 请你计算:网友的年龄一共有 ...
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - H.移动距离
移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列. 其楼房的编号为1,2,3- 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 ...
- 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - H. 等差数列
[问题描述] 数学老师给小明出了一道等差数列求和的题目. 但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数. 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项? [输 ...
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - H. 饮料换购
饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账). 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对 ...
- 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解
第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...
最新文章
- C++ break语句,continue语句,goto语句
- python数字图像的行 宽的不同处 cv2.resize(1389,1500) p1列宽 p2 行高 stop2.shape 得(640,960,3) v1列宽 v2 行高 v3 通道数
- Android利用Looper在子线程中改变UI
- jenkins的安装
- 【网址收藏】华为荣耀V9(DUK-AL20)刷机包下载
- 【python】人机大战
- 运行HelloJersey遇到异常解决方法
- 2020-12-16子类对象指针强转成父类对象指针,父类对象指针调用子类函数问题(待整理)
- hduoj 1518square
- The Beauty of DirectX 11 (3) --- constant buffer, buffered/structure buffer
- 关于校企合作的一些想法和思路
- 重庆APP开发价格费用如何计算?
- 【IDEA】 弹出Server's certificate is not trusted 解决方法
- 大二数据库实验报告答案
- 自动抓取app数据的攻与防
- 阿里年薪50WJAVA工程师转大数据学习路线!
- FHQ Treap 总结
- Can't connect to Mysql server on .....(10038)的解决办法
- MYSQL正则匹配手机号码
- HC?OC?这些校招黑话你看明白了吗?
热门文章
- Codeforces 285E Positions in Permutations dp + 容斥原理
- BZOJ 4710: [Jsoi2011]分特产
- 我们越来越浮躁的心靠什么去滋润
- 代码优化Android ListView适配器三级优化详解
- Nginx——事件驱动机制(雷霆追风问题,负载均衡)
- iphone/ipad图标尺寸
- 【More Effective C#】LINQ表达式与方法调用的映射
- markdown mysql高亮_修改博客园markdown编辑器代码高亮风格的方法
- 奇安信cdn配置教程_PicGo+jsDelivr+GitHub搭建免费cdn加速的图床
- Java黑皮书课后题第1章:1.1(显示三条消息)编写程序,显示Welcome to Java、Welcome to Computer Science和Programming is fun