c++ - 给出 BITS 的总和,找到该数字

标签 c++ algorithm big-o

问题描述:给你一个数字N,你必须判断是否存在数字K,使得从1到K的所有数字的BITS之和等于N。如果存在则打印该数字,否则打印“不存在”。不带引号。

问题链接:http://www.spoj.com/problems/BIT2/

我的代码复杂度是O((log n)^2)并且获得TLE 人们建议我可以在O(log n)中完成,但我是无法弄清楚。 有人可以帮助我如何在 log n 中执行此操作吗?

下面是我的代码,经过一些预计算 + log(n)^2 这是我所做的。

Solution

最佳答案

提示

您已经快到了,请考虑您的 TotalBits 函数:

LL Total_Bits(LL n)
{  
    if(n==0) return 0;
    LL m = Lmb(n);
    n = n - pow(2,m);
    return (n+1) + Total_Bits(n) + m*pow(2,(m-1));
}

您需要做的是将此函数转换为在给定目标位数的单个调用中计算出 n 的位(从最高有效位到最低有效位)的函数。这允许您从使用二分法中删除对数因子。

如何算出 n 的各位?好吧,假设我们正在尝试计算位置 m 是否需要 1。从代码中可以看出,如果 n>=2**m,则答案至少为 m*pow(2,(m-1)+1,如果 n<2**m,则答案为少一点。

Python代码

def find_index(N):
    """Compute the index K such that sum of all bits in numbers 1..K is N"""
    prefix = 0 # Number of 1's in the answer
    answer = 0 # Lower bound on index K
    for m in xrange(63,-1,-1):
        a = 1 << m
        extra = a*prefix + (m*(1<<m)>>1) # Amount we would add to our count if bit m is set
        if N>extra:
            N -= extra
            prefix += 1
            answer += a
    N-=prefix
    return answer if N==0 else "Does Not Exist."

关于c++ - 给出 BITS 的总和,找到该数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21759892/

相关文章:

c++ - "variable"的定义是什么?

c++ - 如何将位图转换为内存中的 PIX?

c++ - Cython vector 操作

c - 在 O(logn) 时间内求出从 k= 0 到 n 的 x^k 的总和

algorithm - 是否有时间复杂度为 Ө(n²) 的决策算法?

c++ - C++中Parents成员变量的继承?

c++ - std::tr1::unordered_map 插入错误

java - 如何从坐标列表中计算最接近给定点的坐标

multithreading - 可重入锁 : pros and cons?

algorithm - 有骗子的选拔程序?