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
            

 

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