1. 程式人生 > >2016年藍橋杯A組 第八題 四平方求和

2016年藍橋杯A組 第八題 四平方求和

四平方和定理,又稱為拉格朗日定理:
每個正整數都可以表示為至多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

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入…” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

這道題,一開始我想的是最直觀的暴力解題法,採用四層迴圈,但是存在超時的危險,所以不建議這樣子做,優化的方向就是減少迴圈的層數,如何減少迴圈層數呢?我們通常會用記憶體換時間,如下:

#include <stdio.h>
#include <math.h>
#define _MAX 5000005
short power[_MAX] = {0};

void solve(int n)
{
    int i, j, k, temp;
    double x;
    for (i = 0; i * i <= n; i++)
    {
        for
(j = 0; j * j <= n; j++) { if (power[n - i * i - j * j] == 0) { continue; } for (k = 0; k * k <= n; k++) { temp = n - i * i - j * j - k * k; x = sqrt((double)temp); if (x == (int)x) { printf("%d %d %d %g\n", i, j, k, x); return ; } } } } return ; } int main(int argc, const char * argv[]) { int n, i, j; //預處理power for (i = 0; i * i <= _MAX; i++) { for (j = 0; j * j <= _MAX; j++) { if (i * i + j * j <= _MAX) { power[i * i + j * j] = 1; } } } scanf("%d", &n); solve(n); return 0; }

用這個方法,可以將複雜度由O(n^4)降低至O(n^2),大大提高了效率,不失為一個很不錯的方法。
OVER!!!

相關推薦

2016藍橋A 平方求和

四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (

2016藍橋A 最大比例

比賽時,當我看到這道題,我徹底的懵比了,沒有思路,沒有思路,沒有思路,重要的事說三遍,賽後,也沒有在網上找別人的程式碼看,因為對省賽感覺很不好,以為自己掛了,所以沒有心情去看題,應該說是不敢去看題,成與敗,關係著我的尊嚴,當初學校不讓我報名A組,很多人都嘲諷我不

2016藍橋省賽C/C++ A 平方和

四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符號表示乘方的

2016藍橋A 網友年齡

某君新認識一網友。 當問及年齡時,他的網友說: “我的年齡是個2位數,我比兒子大27歲, 如果把我的年齡的兩位數字交換位置,剛好就是我兒子的年齡” 請你計算:網友的年齡一共有多少種可能情況? 提示:30歲就是其中一種可能哦. 請填寫表示可能情況的種數。 注意:你提交的應該是一

20167屆藍橋A6牌型種數 題解

題目: 牌型種數 小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦子裡突然冒出一個問題: 如果不考慮花色,只考慮點數

2016藍橋B初賽(七屆)

第一題: 簡單的求和題。 #include<iostream> #include<cmath> using namespace std; int a[110]; int main(){ int i; int

全排列+字符串查找|撲克排序|2014藍橋A解析-fishers

end 之間 中間 using 解析 兩個 clu argv mes 標題:撲克序列 A A 2 2 3 3 4 4, 一共4對撲克牌。請你把它們排成一行。 要求:兩個A中間有1張牌,兩個2之間有2張牌,兩個3之間有3張牌,兩個4之間有4張牌。 請填寫出所有符合要求的排列

2016藍橋BC/C++省賽(預選賽)試題

2016年藍橋杯B組C/C++ 第一題:煤球數目 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100層,共有多少個煤球? 請填表示煤球總數目的數字。 注意:你提交的應該是一個整數,

2017藍橋A(包子湊數)

小明幾乎每天早晨都會在一家包子鋪吃早餐。他發現這家包子鋪有N種蒸籠,其中第i種蒸籠恰好能放Ai個包子。每種蒸籠都有非常多籠,可以認為是無限籠。每當有顧客想買X個包子,賣包子的大叔就會迅速選出若干籠包子來,使得這若干籠中恰好一共有X個包子。比如一共有3種蒸籠,分別能放3、4和5

2015藍橋A 牌型種數 (dfs)

小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦子裡突然冒出一個問題: 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢? 請填寫該整數,不要填寫

2018九屆藍橋B詳解:螺旋曲線

一見這道題,就覺得這道題目很有意思。很快就有了思路(先將圖形分成四個象限,對每個象限進行相應的處理)。出發點是好的,但方法卻選用的不好。舊方法:(如圖所示)將一個象限分為兩個部分,以綠圈為界:第一象限:當點位於綠圈下方,執行++y操作,並使sum值也自增;當點位於綠圈左方,執

六屆藍橋JavaA壘骰子

賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。 經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。 假設有 m 組

2015藍橋B(三羊獻瑞)

三羊獻瑞 觀察下面的加法算式: 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。 請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。 個人用的DFS搜尋,在0~9是個數字中搜索8個數字來滿足題目中要求的算式條件,最有去

星系炸彈(2015藍橋省賽2

/*在X星系的廣袤空間中漂浮著許多X星人造“炸彈”,用來作為宇宙中的路標。每個炸彈都可以設定多少天之後爆炸。比如:阿爾法炸彈2015年1月1日放置,定時為15天,則它在2015年1月16日爆炸。有一個貝塔炸彈,n年y月r日放置,定時為t天,請你計算它爆炸的準確日期並按 yyy

2017藍橋 A(分巧克力)(二分)

9. 標題: 分巧克力    兒童節那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。    小明一共有N塊巧克力,其中第i塊是Hi x Wi的方格組成的長方形。    為了公平起見,小明需要從這 N 塊巧克力中切出K塊巧克力分給小朋友們。切出的巧克力需要滿足

2018藍橋Bc/c++ 詳解

標題:日誌統計 小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是: ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就

2017藍橋 A C/C++ 真及題解

1. (5')標題: 購物單    小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。    這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。    小明也有個怪癖,不到萬不得已,從不

2016藍橋C語言大學A題目1--網友年齡 暴力

  網友年齡 某君新認識一網友。 當問及年齡時,他的網友說: “我的年齡是個2位數,我比兒子大27歲, 如果把我的年齡的兩位數字交換位置,剛好就是我兒子的年齡” 請你計算:網友的年齡一共有多少種可能情況? 提示:30歲就是其中一種可能哦. 請填寫表示可能情況的種數。 注

2016藍橋java B9取球博弈

import java.util.Scanner; class Problem { private int N; private char[][][] dp; private int[] n = new int[3]; private int min = Integ

2016藍橋七屆javaB及答案

煤球數目 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10