给定N,返回满足等式的M:N+M=2*(NXORM)

问题

Given N, return M that satisfy the equation: N + M = 2 * (N ^ M)

约束

1 <= Test Cases = 10^5; 
1 <= N <= 10^18

我在其中一项招聘挑战中遇到了这个问题。

通过反复试验的方法,我发现了一种模式 -这样的 M 存在于 N/3 和 3N 之间,并且N + M 是偶数。所以我对它进行了编码,提交后,我的解决方案只能通过一半的测试用例。这不是什么优化,因为这种方法的时间复杂度与蛮力解决方案的时间复杂度相同。

我知道我的解决方案不是最佳解决方案。

这是我的解决方案:

def solve(n):
    m = n//3
    end = 3*n
    
    # If both m and n are odd/even, their sum will be even
    if (m&1 == 1 and n & 1 == 1) or (m&1 == 0 and n&1 == 0):
        inc = 2
    else:
        m += 1
        inc = 2

    while m <= end:
        if (n + m) == 2 * (n ^ m):
            return m

        m += inc

有人可以为我提供一些提示/方法/算法来获得最佳解决方案。谢谢!

回答

的底位m是确定的(因为n+m必须是偶数)。给定底部位,确定下一位,依此类推。

该观察导致此 O(log n) 解决方案:

def solve(n):
    b = 1
    m = 0
    while n + m != 2 * (n ^ m):
        mask = 2 * b - 1
        if ((n + m) & mask) != ((2 * (n ^ m)) & mask):
            m += b
        b *= 2
    return m

实现这一点的另一种方法是找到其中m+n2*(n^m)不同的最小位,并在 中切换该位m。这导致了这个非常紧凑的代码(使用新的 walrus 运算符,以及一些小技巧):

def solve(n):
    m = 0
    while r := n + m ^ 2 * (n ^ m):
        m |= r & -r
    return m


以上是给定N,返回满足等式的M:N+M=2*(NXORM)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>