首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

墓地設計問題:連續正整數邊長正方形區域的組合求解

     編輯:程式設計疑難解答

這是一道經典的數學/算法題:給定總墓穴數 n (1 <= n <= 10^14),找出所有由連續正整數邊長的正方形區域組成的墓地設計。每個區域邊長為 s,包含 s^2 個墓穴,所有區域邊長互不相同且構成連續序列。輸出所有可能的設計方案,按區域數量降序排列。

問題建模

設連續邊長為 k, k+1, ..., k+l-1(共 l 個區域),則總墓穴數:

n = k^2 + (k+1)^2 + ... + (k+l-1)^2

利用平方和公式:

Σ_{i=0}^{l-1} (k+i)^2 = l*k^2 + k*l*(l-1) + (l-1)l(2l-1)/6

對於給定 l,可解一元二次方程求 k,判斷是否為正整數解。

算法思路

  1. 枚舉區域數量 l。因為最小邊長至少為 1,最大 l 滿足 1^2+2^2+...+l^2 <= n,即 l(l+1)(2l+1)/6 <= n。對於 n <= 10^14,l 最大約 10^4 量級,可直接枚舉。
  2. 對每個 l,由方程 l*k^2 + l(l-1)*k + (l-1)l(2l-1)/6 - n = 0 求解 k。
  3. 判別式 Δ = l^2(l-1)^2 - 4*l*((l-1)l(2l-1)/6 - n) 需為完全平方數,且 k = (-l(l-1) + sqrt(Δ)) / (2l) 為正整數。
  4. 收集所有合法 (l, k),按 l 降序輸出。

樣例驗證

輸入 2030:

  • l=4:k=21 → 21²+22²+23²+24² = 441+484+529+576 = 2030
  • l=3:k=25 → 25²+26²+27² = 625+676+729 = 2030

輸出:

2
4 21 22 23 24
3 25 26 27

複雜度分析

枚舉 l 至 O(n^{1/3}),每步常數時間運算,總體極快,適合 n <= 10^14。

參考實現鏈接

詳細代碼與推導

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved