algorithm - 如何有效解决涉及 'modulo' 操作的编码问题?

标签 algorithm performance time-complexity modulo

我们得到一个整数 'N' 。我们可以选择 (1 到 z) 范围内的任意 2 个数字(a 和 b)。 L 的值由下式给出,

L = Max(( (N%a) %b) %N)  

我们必须计算给定值 'L' 的 (a,b) 对的数量。 我知道蛮力,一个,O(n2) 解决方案。 有没有更有效的方法来解决这个问题?!

最佳答案

我能破译的唯一方法Max(( (N%a) %b) %N)是最大值接管了所有 a, b对。如果我错了,请忽略其余部分。

万一z > N/2 :

  • 首先,观察如果两个ab大于 N , 然后 (N%a) % b产量 N , 所以 (N%a) %b) %N产生 1,这是不令人满意的小。因此至少其中之一应小于 N .

  • 其次,观察(更好的是证明)N % a 的最大值当 a 时实现是N/2 + 1对于偶数 N , 和 (N + 1)/2对于奇数(重要说明:它是 N 之后下一个 2 的倍数的一半)。称之为 maximizer .

  • 最后,观察任何 b大于该模数使其保持不变。证明这确实是所需的最大值。

现在你有足够的事实来有效地提出一个单行程序(不要忘记 a > N, b = maximizer 案例)。

同样的逻辑适用于 z < N/2 .找到最大化器有点棘手,但在 O(1) 中仍然可行(请参阅上面的重要说明)。

关于algorithm - 如何有效解决涉及 'modulo' 操作的编码问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54059583/

相关文章:

performance - 这个 Haskell 代码是否重用了之前的计算?

java - 我的带有 for 循环的二进制搜索算法的大 O?

java - 将 int 转换为 string 减少了计算其长度的时间复杂度

algorithm - 如何求解递归复杂度T(n) = T(n/4)+T(3n/4)+cn

algorithm - 统计/算法 : How do I compare a weekly graph with its own history to see when in the past it was almost the same?

algorithm - 通过删除具有替代字符的子序列将二进制字符串减少为空字符串

c - memset() 是否比 C 中的 for 循环更有效?

performance - Spark有效地过滤小数据帧中存在的大数据帧中的条目

algorithm - O(C(n,r)^2) 的 Big O 运行时复杂度是多少?

c++ - 时间复杂度困惑