四平方和這題比較坑,關鍵是不能著急退出,要搜尋全部情況,但加點優化時間也不是很長.四平方和定理,又稱為拉格朗日定理:
每個正整數都可以表示為至多4個正整數的平方和。
如果把0包括進去,就正好可以表示為4個數的平方和。
比如:5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符號表示乘方的意思)
對於乙個給定的正整數,可能存在多種平方和的表示法。
要求你對4個數排序:
0 <= a <= b <= c <= d
並對所有的可能表示法按 a,b,c,d 為聯合主鍵公升序排列,最後輸出第乙個表示法
程式輸入為乙個正整數n (n<5000000)
要求輸出4個非負整數,按從小到大排序,中間用空格分開
例如,輸入:
5則程式應該輸出:
0 0 1 2
再例如,輸入:
12則程式應該輸出:
0 2 2 2
再例如,輸入:
773535
則程式應該輸出:
1 1 267 838
資源約定:
峰值記憶體消耗 < 256m
cpu消耗 < 3000ms
首先我們在sqrt(n)的時間生成乙個陣列a,裡面存平方數
然後再 sqrt(n)^2時間內生成乙個陣列b,裡面存平方數 * 平方數
關鍵是利用乙個長度為n的陣列c
c是乙個結構體陣列
.b表示這個c[i]是否是 平方數 * 平方數,也就是形如x^2 +y^2的形式
同時 .x .y記錄x和y
一切準備就緒之後
就列舉b陣列
然後根據c陣列直接得到是否滿足
注意不要找到第一組就退出迴圈,而是要把每種情況都找出來再比較
實際上也只是需要sqrt(n)^2的時間
這裡用乙個pair, pair>型別來方便比較
#include using namespace std;
const int inf = int_max;
struct v
v(bool b, int x, int y) : b(b), x(x), y(y) {}
};auto makepair(int a, int b, int c, int d)
int main()
else }}
auto ans = makepair(inf, inf, inf, inf);
for (int e : b)
}cout << ans.first.first << ' ' << ans.first.second << ' ' << ans.second.first << ' ' << ans.second.second << endl;
}
備戰藍橋杯 2016(8)四平方和
四平方和定理,又稱為拉格朗日定理 每個正整數都可以表示為至多4個正整數的平方和。如果把0包括進去,就正好可以表玉為4個數的平方和。比如 5 02 02 12 22 7 12 12 12 22 對於乙個給定的正整數,可能存在多種平方和的表示法。要求你對4個數排序 0 a b c d 並對所有的可能表示...
2016 8 四平方和
四平方和定理,又稱為拉格朗日定理 每個正整數都可以表示為至多4個正整數的平方和。如果把0包括進去,就正好可以表示為4個數的平方和。5 0 2 0 2 1 2 2 2 7 1 2 1 2 1 2 2 2 對於乙個給定的正整數,可能存在多種平方和的表示法。要求你對4個數排序 0 a b c d 並對所有...
藍橋杯 四平方和
四平方和 四平方和定理,又稱為拉格朗日定理 每個正整數都可以表示為至多4個正整數的平方和。如果把0包括進去,就正好可以表示為4個數的平方和。比如 5 0 2 0 2 1 2 2 2 7 1 2 1 2 1 2 2 2 符號表示乘方的意思 對於乙個給定的正整數,可能存在多種平方和的表示法。要求你對4個...