給定兩個數字M和N.令qi爲i * N/M的整數部分。 qi從0到M-1的和是多少? O(M)是明顯的方法。這可以在更短的時間內完成,可能是O(1)如果存在一些簡單的簡化表達式?查找所有商的總和
查找所有商的總和
回答
有趣的問題。 (這篇文章會讓我希望我們能有數學格式化對SO ...)
我的方法是編寫問題,
∑i floor(i*N/M) = ∑i i*N/M - ∑i [i*N/M]
其中[]
是「小數部分的」操作符(即[1.3] = 0.3,[6] = 0等)。
然後,前半部分很容易:這是一個正常的算術序列總和乘以N/M
,所以它總和爲N*(M-1)/2
。下半場比較棘手,但你會明白爲什麼把它與上半場分開是至關重要的。
讓k = gcd(N, M)
。然後,讓n = N/k
和m = M/k
,所以下半部分是∑i [i*n/m]
。至關重要的是,n
和m
現在是相對主要的。 i
之和是從0
到M-1 = km-1
。我們可以拆分成i
的m
多,其餘的,如i = qm + r
,使得總量現在是
∑q ∑r [r*n/m]
,其中來自0
q
款項k-1
和r
彙總來自0
到m-1
。現在到了關鍵的一步:因爲n
和m
互質,爲r = 0..m-1
序列r*n
是置換0, 1, 2, 3, ..., m-1
模m。因此,序列[r*n/m]
是排列的0/m, 1/m, 2/m, ..., (m-1)/m
,因此∑r [r*n/m] = ∑r r/m = m*(m-1)/2/m = (m-1)/2
。因此,全部金額崩潰到k * (m-1)/2 = (km - k)/2 = (M - k)/2
。
最後,我們結合了一半:N*(M-1)/2 - (M-k)/2 = (NM - N - M + k)/2
。
因此,期望的總和是(NM - N - M + gcd(N, M))/2
。用歐幾里德算法計算GCD可以做到relatively quickly,所以計算起來相當快。
它看起來像我試圖總結0N/M + 1N/M + 2N/M + 3N/M ...(M-1)N/M。如果是這樣,你有(0 + 1 + 2 + 3 ... +(M-1))N/M。由於(0 + 1 + 2 + 3 + ... +(M-1))是M *(M-1)/ 2,所以可以在O(1)中求解。 M的取消,你得到(M-1)N/2。
獲得對此問題的更好回覆。它是i * N/M的商或整數部分。商可能會產生誤導。我編輯過。 – 2013-03-09 07:32:56
- 1. 查找所有商店的產品總庫存量
- 2. 查詢查找所有提供所有服務的提供商
- 3. 找到所有變量的總和?
- 4. 查找號碼的所有組合,爲特定的總和
- 5. 查找所有可能的子集總和給定的數
- 6. javaScript - 查找給定整數的所有因數的總和
- 7. 查找緩衝區中所有字節的總和
- 8. 查找Session數組中所有鍵的總和
- 9. 如何查找所有重疊間隔的總和權重?
- 10. 查找一天中所有花費時間的總和
- 11. 查找二維數組中所有元素的總和
- 12. sqlite查詢找到列中所有值的總和
- 13. 查找所有達到給定總和的數字組合
- 14. 查找數組中所有數字的排列總和爲16
- 15. 如何查找每個DStream中RDD中所有值的總和?
- 16. 查找二叉樹中所有等於總和的路徑
- 17. 查找總和爲特定值的所有子集
- 18. 查找列中所有值的總和[RNG]
- 19. 如何查找數組中所有數字的總和?
- 20. 查找總和有條件的mysql
- 21. 查找銷售商品的產品成本總和
- 22. 查找樹的總和
- 23. 查找變量的總和
- 24. 查找值的總和
- 25. 查詢和總結所有與貓鼬
- 26. SQL查詢找到具有相同列的所有行的總和
- 27. 所有參數的總和
- 28. 使用angularjs在訂購商品中查找總數和小計總數?
- 29. 查找包含少於10件產品的所有商品
- 30. Adventureworks - 查找數據庫中的所有商店名稱
您可以通過http://math.stackexchange.com/ – 2013-03-09 07:23:21