📜  查找范围 [2, N] 中的所有 M 使得直到 M 的按位或等于直到 M-1 的值

📅  最后修改于: 2022-05-13 01:56:08.351000             🧑  作者: Mango

查找范围 [2, N] 中的所有 M 使得直到 M 的按位或等于直到 M-1 的值

给定一个整数N ,任务是在[2, N]范围内找到所有可能的整数M ,使得直到 M 的所有正值的按位或与直到M-1的所有正值的按位或相同。

例子:

方法:解决此问题的方法基于以下观察:

请按照以下步骤解决此问题:

  • 计算a = log 2 N。
  • 迭代从1a的 2 的幂(例如使用变量exp ),并将ans (最初为 0)增加(2 exp + 1 – 2 exp – 1)
  • 最后,计算N2 a之间的对 通过将(n – 2 a )添加到ans
C++
// C++ code to implement the approach
  
#include 
using namespace std;
  
// Function to calculate
// total matches in the range
int checkXORrange(int n)
{
    int ans = 0;
    int a = log2(n);
  
    for (int exp = 1; exp <= a; exp++)
        ans += pow(2, exp) - pow(2, exp - 1) - 1;
  
    ans += n - pow(2, a);
    return ans;
}
  
// Driver code
int main()
{
    int N = 7;
  
    // Function call
    cout << checkXORrange(N) << endl;
    return 0;
}


C
// C code to implement the approach
  
#include 
#include 
  
// Function to calculate
// total matches in the range
int checkXORrange(int n)
{
    int ans = 0;
    int a = log2(n);
    for (int exp = 1; exp <= a; exp++)
        ans += pow(2, exp) - pow(2, exp - 1) - 1;
    ans += n - pow(2, a);
    return ans;
}
  
// Driver code
int main()
{
    int N = 7;
  
    // Function call
    printf("%d\n", checkXORrange(N));
    return 0;
}


Python3
# Python3 code to implement the approach
  
import math
  
# Function to calculate 
# total matches in the range
def checkXORrange(n):
    ans = 0
    a = int(math.log2(n))
    for exp in range(1, a + 1):
        ans += 2 ** exp - 2 ** (exp - 1) - 1
    ans += n - 2 ** a
    return ans
  
# Driver Code
if __name__ == "__main__":
    N = 7
    print(checkXORrange(N))


输出
4

时间复杂度: O(log 2 N)
辅助空间: O(1)