找到相加等於2021的等差數列
2020除夕晚上,我給了一道題目:如何不用暴力窮舉,找到相加為2021的等差數列。
時光匆匆過了5個月,我才來得及把這道趣題的思路整理一下。等差數列的求和公式大家都知道,a1 + a2 + ... + an = (a1 + an)*n/2
。這說明2021作為等差數列的和,必須能夠分解成兩個整數的乘積。當然這裡有個前提條件,就是這個等差數列是不平凡的。平凡的等差數列只有一個元素,就是[2021]
。
怎樣因數分解2021呢,普通方法是試除,程式設計師可能會忍不住暴力求解。但是我們覺得這樣不夠優美。大家可能會想到用埃拉託斯特尼篩法,從2, ..., 2021
用篩法篩除,找到因子。但這仍然屬於暴力解法。有一種用法國業餘數學家費馬命名的“費馬分解法”:如果2021=(a+b)(a-b)=a^2 - b^2
,則2021 + b^2 = a^2
。我們可以把2021加上一個小平方數,看看它是否等於另一個平方數。特別巧:2021 + 4 = 2025
,其中4是2的平方,2025是45的平方。很多同學都背過25*25 = 625, 35*35 = 1225, 45*45 = 2025, ... 95*95 = 9025
吧?於是2021=(45-2)(45+2) = 43 * 47
恰巧43, 47都是素數。於是我們知道2021只能分解為2個等差數列之和。(a1 + an)/2, n
只能分別是43, 47或者反過來。這就是本題的答案。最後兩個等差數列分別是:
20+21+22+...+66
和26+27+28+...+68
最後留一道習題給大家:你能證明25*25 = 625, 35*35 = 1225, 45*45 = 2025, ... 95*95 = 9025
這個口訣的正確性麼?x5 * x5 = [x(x+1)]25
?
更多數學內容見《同構——程式設計中的數學》
相關文章
- 25.【等差數列】
- 樹上的等差數列 [樹形dp]
- 【題解】A23329.等差數列計數
- Trick:處理加減等差數列的技巧
- 東華 OJ 一維陣列競賽 等差數列陣列
- 線段樹維護區間等差數列
- 用Python解決一個等差數列的求和問題Python
- 2017年藍橋杯javaB組——等差素數列Java
- 金題大戰Vol.0 C、樹上的等差數列
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- 找到陣列中出現特定次數數字的問題陣列
- 第十屆藍橋杯省賽C++B組 等差數列C++
- 找到無序陣列中最小的k個數陣列
- 給定陣列中找到最大的兩個數陣列
- 448. 找到所有陣列中消失的數字陣列
- 給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。陣列
- LeetCode-448-找到所有陣列中消失的數字LeetCode陣列
- 淦448. 找到所有陣列中消失的數字陣列
- LeetCode 關於陣列的相對排序LeetCode陣列排序
- 如何從整數陣列中找到最大和最小數陣列
- 力扣448. 找到所有陣列中消失的數字力扣陣列
- 輸入一個整數陣列,輸出奇偶數相間排列的陣列陣列
- 在其它數都出現k次的陣列中找到只出現一次的數陣列
- 一維陣列:相鄰兩數求和陣列
- 資訊學奧賽一本通 1035:等差數列末項計算 | OpenJudge NOI 1.3 18
- 找到兩個陣列中的公共元素陣列
- 2019年省賽第十屆藍橋杯B組C/C++試題H解 等差數列C++
- 1122. 陣列的相對排序(計數排序 / 自定義排序)陣列排序
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- 【遞迴打卡1】在兩個長度相等的排序陣列中找到上中位數遞迴排序陣列
- 關於js陣列方法sort()負數排序的陷阱JS陣列排序
- 計算兩列的相關性
- 3229. 使陣列等於目標陣列所需的最少操作次數陣列
- abc253E 相鄰元素之差不低於K的序列數
- 佇列mq 相關佇列MQ
- 狀態列相關
- 在 2021 年你需要掌握的 7 種關於 JavaScript 的陣列方法JavaScript陣列
- 如何找到計數表在不同的行嗎