close
Content

根據 Lagrange 的四平方和定理,每個正整數可以用四個完全平方數的和來表示。例如:

3 = 12 + 12 + 12 + 02
31 = 52 + 22 + 12 + 12

可是有些正整數可以用三個非負完全平方數的和來表示。例如: 

3 = 12 + 12 + 12
17 = 02 + 12 + 42

給你一個整數 K 請你以三個平方數的和來表示,或是陳明這是不可能的。

Input
第一行有一個整數 N (0 < N <= 10000),表示有幾個測試資料。接下來的 N 行每行有一個正整數 K (0 < K <= 50000)。
Output
對於每一個測資,請以 "a b c" 的格式印出一行。其中 a <= b <= c 且 K = a2 + b2 + c2。如果可能的答案不只一個,印出字典順序最小的。如果無法以三個非負平方數來表示則印 "-1" (參考範例)。
Sample Input #1
t=int(input())
strn=[-1]*50001
for i in range(255):
    for j in range(i,255):
        for k in range(j,255):
            if((i*i+j*j+k*k)>50000): break
            if(strn[i*i+j*j+k*k]==-1): strn[i*i+j*j+k*k]=(str(i)+" "+str(j)+" "+str(k))
for z in range(t):
    ans=int(input())
    print(strn[ans])
3
13
15
17
Sample Output #1
0 2 3
-1
0 1 4

python TLE版:

strn=[-1]*50001
for i in range(255):
  for j in range(255):
    for k in range(255):
      if(i**2+j**2+k**2)>50000:break
      if strn[i**2+j**2+k**2]==-1:strn[i**2+j**2+k**2]=str(i)+' '+str(j)+' '+str(k)
#print(strn)
t=int(input())
for i in range(t):
  ans=int(input())
  print(strn[ans])

python AC版:

t=int(input())
strn=[-1]*50001
for i in range(255):
    for j in range(i,255):
        for k in range(j,255):
            if((i*i+j*j+k*k)>50000): break
            if(strn[i*i+j*j+k*k]==-1): strn[i*i+j*j+k*k]=(str(i)+" "+str(j)+" "+str(k))
for z in range(t):
    ans=int(input())
    print(strn[ans])
arrow
arrow
    創作者介紹
    創作者 趴趴熊日常 的頭像
    趴趴熊日常

    資工趴趴熊的小天地

    趴趴熊日常 發表在 痞客邦 留言(0) 人氣()