躲得了初一躲不过十五——之一定会遇到不会的题目只能当作第一次学之这次遇到的是暴力算法

题目描述

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

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

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

比如:

5=02+02+12+225=02+02+12+22。

7=12+12+12+227=12+12+12+22。

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

要求你对 44个数排序使得 0≤a≤b≤c≤d。

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

输入格式

程序输入为一个正整数 N(N<5e6)。

输出格式

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

输入输出样例

输入 #1

5

输出 #1

0 0 1 2

输入 #2复制

12

输出 #2

0 2 2 2

输入 #3

773535

输出 #3

1 1 267 838

看到式子不要像我一样太着急着去找规律,这是蓝桥杯的考试题目类型之一。我以上来就想找到数字的规律以化简算法。这道题目只能暴力算法,因为拉格朗日也没有说明这四个数的范围和关系。但是需要注意的是,如果直接穷举需要四个for循环,但是你变化一下式子就可以减少它的“自由度”。

但是我的研究还是起到了一定作用,我发现对于n < 4 有( n / 2 ) * ( n / 2 ) > n ,所以可以减少一部分工作,还有就是n > a * a的时候( n / a ) * ( n / a )  >  n 。

事实是我的思考不是白费的,如果不加以限制那么我的java(没有C++那么快)是通过不了的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值