题目背景
四方定理是数论中著名的一个定理,指任意一个自然数都可以拆成四个自然数的平方之和。例如:
25 = 1^2 + 2^2 + 2^2 + 4^2
对25来说,还有其他方案:
25 = 0^2 + 0^2 + 3^2 + 4^2
以及
25 = 0^2 + 0^2 + 0^2 + 5^2
题目描述
给定一个自然数 n,请输出 n 的所有四平方拆分方案。
输入格式
单个整数:表示 n。
输出格式
若干行:每行四个由小到大排列的自然数,表示一种拆分方案。如果有多种方案,先输出首项较小的方案,对于首项相同的方案,先输出第二项较小的方案,其他情况以此类推。
数据范围
0≤n≤50,000。
样例数据
输入:
25
输出:
0 0 0 5
0 0 3 4
1 2 2 4
原因分析:
这个题目重要的是减少时间复杂度。采用暴力破解。4个循环即可得到答案。
但是,发现无法满足<1000ms 的要求。 因此想到减少循环次数,最后一个数用哈希表来加快运算速度。
解决方案:
n=int(input())
def new_ans(n:int):
sn=int(n**0.5)+1
d={i**2:i for i in range(sn)} #生成最后一个平方数的字典
for i in range(sn//2+1):
for j in range(i,sn-i):
for k in range(j,sn-i):
a=n-(i**2+j**2+k**2)
if a in d and a>=k**2: #判断a是否在列表l当中,并判断a是否>=k**2
print(i,j,k,d[a])
new_ans(n)