给定两个数字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. javaScript - 查找给定整数的所有因数的总和
- 6. 查找缓冲区中所有字节的总和
- 7. 如何查找数组中所有数字的总和?
- 8. 查找列中所有值的总和[RNG]
- 9. 查找总和有条件的mysql
- 10. 查找总和LINQ
- 11. 查找树的总和
- 12. 查找值的总和
- 13. 查询和总结所有与猫鼬
- 14. Adventureworks - 查找数据库中的所有商店名称
- 15. 如何查找用户所有权下的所有文件的总大小?
- 16. 查找关闭总和
- 17. 查找因子总和
- 18. 在MapReduce中查找总和
- 19. Python:查找数组总和
- 20. 查找给定的一组整数的总和达到给定总和的所有组合
- 21. 我的总和(总计)显示了所有用户的总和
- 22. 以上的给予所有子集查找总和的值设置
- 23. 查找CockroachDB中所有表的总行数
- 24. 查找文本的所有实例和替换所有
- 25. 查找重复数字的所有组合以达到给定总和
- 26. 查找并打印文本文件中所有整数的总和
- 27. C#反射和查找所有引用
- 28. 查找值的所有ID
- 29. 总和所有显示值
- 30. 如何查询所有国家的所有iTunes商店战线?
您可以通过http://math.stackexchange.com/ – 2013-03-09 07:23:21