leetCode 279. 完全平方數

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

示例 1:

輸入: n = 12
輸出: 3 
解釋: 12 = 4 + 4 + 4.

示例 2:

輸入: n = 13
輸出: 2
解釋: 13 = 4 + 9.

四平方數和定理(theorem on the sum of foursquares)亦稱拉格朗日四平方數和定理。四平方數和問題是著名的數論問題.由拉格朗日(La-grange, J.-L.)最終解決,從而有上面的定理名字.該定理斷言:每個正整數均可表爲四個整數的平方和(其中有些整數可以爲零)。

定理: 當n是形如4^α*(8k+7) (α≥0, k≥0)的正整數時, n不能表爲三個整數的平方和.
證: 對任意整數x有
x²≡0,1或4(mod 8) (7)
易知, x₁²+x₂²+x₃²≢7(mod 8). 當α=0時, 定理成立. 假設對α=l (l≥0)時成立. 當α=l+1時, 若有4^(l+1)*(8k₁+7)=x₁²+x₂²+x₃², 則必有x₁²+x₂²+x₃²≡0或4(mod 8), 進而式(7)推出x₁≡x₂≡x₃≡0(mod 2). 
所以有4^l*(8k₁+7)=(x₁/2)²+(x₂/2)²+(x₃/2)². 這和歸納假設矛盾, 所以定理對α=l+1也成立. 證畢.

定理6: n=2*4^α (α≥0)不能表爲四個正平方數之和.
證: 當α=0時, 即n=2, 該定理明顯成立. 假設定理對α≥l (l≥0)時成立, 當α=l+1時, 若2*4^(l+1)=x₁²+x₂²+x₃²+x₄², 當x₁,x₂,x₃,x₄爲兩奇兩偶時, 那麼x₁²+x₂²+x₃²+x₄²≡2(mod 4)不可能, 所以x₁,x₂,x₃,x₄都爲偶數, 則有2*4^l=(x₁/2)²+(x₂/2)²+(x₃/2)²+(x₄/2)², 這和歸納假設矛盾, 所以定理對α=l+1也成立. 證畢.

(定理證明來源:https://tieba.baidu.com/p/5056466566?red_tag=1873832645&traceid=

下面的解只用到了上面的定理:

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        #如果滿足式子條件返回4
        temp = n
        while temp % 4 == 0:
            temp/=4
        if temp % 8 == 7:
            return 4
        #否則尋找是否有兩個整數的平方能構成n
        a = 0
        while a**2<=n:
            b = int((n - a**2)**0.5)
            if a**2 + b**2 == n:
                if a!=0 and b!=0:
                    return 2
                else:
                    return 1
            a+=1
        #都不行就返回3
        return 3
            

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章