演算法學習之路|四平方和

kissjz發表於2018-02-24

題目大意
四平方和定理,又稱為拉格朗日定理:每個正整數都可以表示為至多 4 個正整數的平方和。如果把 0包括進去,就正好可以表示為 4 個數的平方和。

比如:

5=0^2+0^2+1^2+2^2

7=1^2+1^2+1^2+2^2

則對於一個給定的正整數 n,可以表示為:n=a^2+b^2+c^2+d……。

你需要求出字典序最小的一組解 a,b,c,d。

字典序大小:從左到右依次比較,如果相同則比較下一項,直到有一項不同,較小的一方字典序更小,反之字典序更大,所有項均相同則二者字典序相同。

輸入格式
程式輸入為一個正整數 N(1≤N≤5000000)。

輸出格式
輸出 4個非負整數 a,b,c,d中間用空格分開。

樣例輸入1
5
樣例輸出1
0 0 1 2
樣例輸入2
12
樣例輸出2
0 2 2 2
其實我們只需要列舉 a,b,ca,b,c 就可以了,因為 dd 是可以通過 a,b,c

a,b,c 的值計算出來的。這樣我們就可以減少一層迴圈,從而降低程式執行時間,以避免執行超時。

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i1=0;i1<2300;i1++){
        for(int i2=0;i2<2300;i2++){
            for(int i3=0;i3<2300;i3++){
                int i4=sqrt(n-i1*i1-i2*i2-i3*i3);
                if(i1*i1+i2*i2+i3*i3+i4*i4==n){
                    cout<<i1<<" "<<i2<<" "<<i3<<" "<<i4<<endl;
                    return 0;
                }
            }
        }
    }
}


相關文章