每日一题 LeetCode 633平方数之和

简单傻逼题
每天一个无用小知识
新数学知识get√

链接:https://leetcode-cn.com/problems/sum-of-square-numbers/
一般暴力解法:

class Solution {
     
    typedef long long ll;
    set<ll> vis;
    public:
        bool judgeSquareSum(ll c) {
     
            for(ll i = 0; ; i++){
     
                if(i * i > c)
                    break;
                vis.insert(i * i);
                if(vis.find(c - i * i) != vis.end())
                    return true;
            }
            return false;
        }
};

优化解法:
费马平方和定理
一个非负整数 c如果能够表示为两个整数的平方和,当且仅当 c 的所有形如 4k + 3 的质因子的幂均为偶数。

class Solution {
     
    typedef long long ll;
    map<ll,int> vis;
    public:
        bool judgeSquareSum(ll c) {
     
            while(c > 0){
     
                int f = 1;
                for(ll i = 2;i <= sqrt(c) ; i++){
     
                    if(c % i == 0){
     
                        vis[i]++;
                        c = c/i;
                        f = 0;
                        break;
                    }
                }
                if(f){
     
                    vis[c]++;
                    break;
                }
            }
            for(auto i :vis){
     
                if(i.first % 4 == 3 && i.second & 1)
                    return false;
            }
            return true;
        }
};

你可能感兴趣的:(LeetCode)