Find longest range from numbers in range [1, N] having positive bitwise AND
Given a number N, the task is to find the longest range of integers [L, R] such that 1 ≤ L ≤ R ≤ N and the bitwise AND of all the numbers in that range is positive.
Examples:
Input: N = 7
Output: 4 7
Explanation: Check and from 1 to 7
Bitwise AND operations:
from 1 to 7 is 0
from 2 to 7 is 0
from 3 to 7 is 0
from 4 to 7 is 4
Therefore, maximum range comes out from L = 4 to R = 7.
Input: K = 16
Output: 8 15
Approach: The problem can be solved based on the following mathematical observation. If 2K is the closest exponent of 2 greater than N then the maximum range will be either of the two:
- From 2(K – 2) to (2(K – 1) – 1) [both value inclusive] or,
- From 2(K – 1) to N
Because these ranges confirm that all the numbers in the range will have the most significant bit set for all of them. If the ranges vary for powers of 2 then the bitwise AND of the range will become 0.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int minpoweroftwo( int K)
{
int count = 0;
while (K > 0) {
count++;
K = K >> 1;
}
return count;
}
void findlongestrange( int N)
{
int K = minpoweroftwo(N);
int y = N + 1 - pow (2, K - 1);
int z = ( pow (2, K - 1) - pow (2, K - 2));
if (y >= z) {
cout << pow (2, K - 1) << " " << N;
}
else {
cout << pow (2, K - 2) << " "
<< pow (2, K - 1) - 1;
}
}
int main()
{
int N = 16;
findlongestrange(N);
return 0;
}
|
C
#include <math.h>
#include <stdio.h>
int minpoweroftwo( int K)
{
int count = 0;
while (K > 0) {
count++;
K = K >> 1;
}
return count;
}
void findlongestrange( int N)
{
int K = minpoweroftwo(N);
int y = N + 1 - pow (2, K - 1);
int z = ( pow (2, K - 1) - pow (2, K - 2));
if (y >= z) {
printf ( "%d %d" , ( int ) pow (2, K - 1), N);
}
else {
printf ( "%d %d" , ( int ) pow (2, K - 2),
( int ) pow (2, K - 1)-1);
}
}
int main()
{
int N = 16;
findlongestrange(N);
return 0;
}
|
Java
class GFG {
static int minpoweroftwo( int K) {
int count = 0 ;
while (K > 0 ) {
count++;
K = K >> 1 ;
}
return count;
}
static void findlongestrange( int N) {
int K = minpoweroftwo(N);
int y = ( int ) (N + 1 - Math.pow( 2 , K - 1 ));
int z = ( int ) (Math.pow( 2 , K - 1 ) - Math.pow( 2 , K - 2 ));
if (y >= z) {
System.out.println(Math.pow( 2 , K - 1 ) + " " + N);
} else {
System.out.print(( int ) Math.pow( 2 , K - 2 ));
System.out.print( " " );
System.out.print(( int ) Math.pow( 2 , K - 1 ) - 1 );
}
}
public static void main(String args[]) {
int N = 16 ;
findlongestrange(N);
}
}
|
Python3
def minpoweroftwo(K):
count = 0 ;
while (K > 0 ):
count + = 1 ;
K = K >> 1 ;
return count;
def findlongestrange(N):
K = minpoweroftwo(N);
y = int (N + 1 - pow ( 2 , K - 1 ));
z = int ( pow ( 2 , K - 1 ) - pow ( 2 , K - 2 ));
if (y > = z):
print ( pow ( 2 , K - 1 ) , " " , N);
else :
print ( pow ( 2 , K - 2 ));
print ( " " );
print ( pow ( 2 , K - 1 ) - 1 );
if __name__ = = '__main__' :
N = 16 ;
findlongestrange(N);
|
C#
using System;
class GFG {
static int minpoweroftwo( int K)
{
int count = 0;
while (K > 0) {
count++;
K = K >> 1;
}
return count;
}
static void findlongestrange( int N)
{
int K = minpoweroftwo(N);
int y = ( int )(N + 1 - Math.Pow(2, K - 1));
int z = ( int )(Math.Pow(2, K - 1)
- Math.Pow(2, K - 2));
if (y >= z) {
Console.Write(Math.Pow(2, K - 1) + " " + N);
}
else {
Console.Write(( int )Math.Pow(2, K - 2));
Console.Write( " " );
Console.Write(( int )Math.Pow(2, K - 1) - 1);
}
}
public static void Main()
{
int N = 16;
findlongestrange(N);
}
}
|
Javascript
<script>
function minpoweroftwo(K) {
let count = 0;
while (K > 0) {
count++;
K = K >> 1;
}
return count;
}
function findlongestrange(N)
{
let K = minpoweroftwo(N);
let y = N + 1 - Math.pow(2, K - 1);
let z = (Math.pow(2, K - 1) - Math.pow(2, K - 2));
if (y >= z) {
document.write(Math.pow(2, K - 1) + " " + N);
}
else {
document.write(Math.pow(2, K - 2) + " "
+ (Math.pow(2, K - 1) - 1));
}
}
let N = 16;
findlongestrange(N);
</script>
|
Time Complexity: O(logN)
Auxiliary Space: O(1)
Last Updated :
25 Jan, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...