如何有效解决涉及 '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:

  • 首先,观察如果ab都大于N,那么(N%a) % b产生N,所以(N%a) %b) %N 产生 1,这是不令人满意的小。因此至少有一个小于N.

  • 其次,观察(更好的是,证明)当 aN/2 + 1N % a 的最大值达到 N , 和 (N + 1)/2 表示奇数(重要说明:它是 N 之后下一个 2 的倍数的一半。称之为 maximizer

  • 最后,观察任何大于该模数的 b 都保持不变。证明这确实是期望的最大值。

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

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