如何有效解决涉及 'modulo' 操作的编码问题?
How can I solve this coding problem efficiently which involves the 'modulo' operation?
我们得到一个整数 '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
:
首先,观察如果a
和b
都大于N
,那么(N%a) % b
产生N
,所以(N%a) %b) %N
产生 1,这是不令人满意的小。因此至少有一个小于N
.
其次,观察(更好的是,证明)当 a
为 N/2 + 1
时 N % a
的最大值达到 N
, 和 (N + 1)/2
表示奇数(重要说明:它是 N
之后下一个 2 的倍数的一半。称之为 maximizer
。
最后,观察任何大于该模数的 b
都保持不变。证明这确实是期望的最大值。
现在你有足够的事实来有效地想出一个单行程序(不要忘记 a > N, b = maximizer
案例)。
同样的逻辑适用于 z < N/2
。找到最大化器有点棘手,但在 O(1)
中仍然可行(请参阅上面的 重要说明 )。
我们得到一个整数 '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
:
首先,观察如果
a
和b
都大于N
,那么(N%a) % b
产生N
,所以(N%a) %b) %N
产生 1,这是不令人满意的小。因此至少有一个小于N
.其次,观察(更好的是,证明)当
a
为N/2 + 1
时N % a
的最大值达到N
, 和(N + 1)/2
表示奇数(重要说明:它是N
之后下一个 2 的倍数的一半。称之为maximizer
。最后,观察任何大于该模数的
b
都保持不变。证明这确实是期望的最大值。
现在你有足够的事实来有效地想出一个单行程序(不要忘记 a > N, b = maximizer
案例)。
同样的逻辑适用于 z < N/2
。找到最大化器有点棘手,但在 O(1)
中仍然可行(请参阅上面的 重要说明 )。