Given two numbers A and K, the task is to find K’th smallest positive integer B, such that A + B = A | B, where | denotes the bitwise OR operator.
Examples:
Input: A = 10, K = 3 Output: 5 Explanation: K = 1, 10 + 1 = 10 | 1 = 11 K = 2, 10 + 4 = 10 | 4 = 14 K = 3, 10 + 5 = 10 | 5 = 15 Input: A = 1, B = 1 Output: 2
Approach:
- B is a solution of the given equation if and only if B has 0 in all positions where A has 1 (in binary notation).
- So, we need to determine the bit of B for positions where A has 0. Let, if A = 10100001, then the last eight digits of B must be 0_0____0, where _ denotes either 0 or 1. Any replacement of all _ by 0 or 1 gives us a solution.
- The k-th smallest number will be received by replacing all _ in y by digits of the binary representation of the number k.
Below is the implementation of the above approach:
C++
// C++ program for the // above approach #include <bits/stdc++.h> using namespace std;
// Function to find k'th // smallest number such that // A + B = A | B long long kthSmallest( long long a, long long k)
{ // res will store
// final answer
long long res = 0;
long long j = 0;
for ( long long i = 0; i < 32; i++) {
// Skip when j'th position
// has 1 in binary representation
// as in res, j'th position will be 0.
while (j < 32 && (a & (1 << j))) {
// j'th bit is set
j++;
}
// If i'th bit of k is 1
// and i'th bit of j is 0
// then set i'th bit in res.
if (k & (1 << i)) {
res |= (1LL << j);
}
// Proceed to next bit
j++;
}
return res;
} // Driver Code int main()
{ long long a = 5, k = 3;
cout << kthSmallest(a, k) << "\n" ;
return 0;
} |
Java
// Java program for above approach import java.util.*;
class GFG
{ // Function to find k'th
// smallest number such that // A + B = A | B static int kthSmallest( int a, int k)
{ // res will store
// final answer
int res = 0 ;
int j = 0 ;
for ( int i = 0 ; i < 32 ; i++) {
// Skip when j'th position
// has 1 in binary representation
// as in res, j'th position will be 0.
while (j < 32 && (a & ( 1 << j)) != 0 ) {
// j'th bit is set
j++;
}
// If i'th bit of k is 1
// and i'th bit of j is 0
// then set i'th bit in res.
if (k != 0 & ( 1 << i) != 0 ) {
res |= ( 50 << j);
}
// Proceed to next bit
j++;
}
return (-res);
} public static void main(String[] args) {
int a = 5 , k = 3 ;
System.out.println(kthSmallest(a, k));
}
} |
Python3
# Python3 program for the above approach # Function to find k'th # smallest number such that # A + B = A | B def kthSmallest(a, k):
# res will store
# final answer
res = 0
j = 0
for i in range ( 32 ):
# Skip when j'th position
# has 1 in binary representation
# as in res, j'th position will be 0.
while (j < 32 and (a & ( 1 << j))):
# j'th bit is set
j + = 1
# If i'th bit of k is 1
# and i'th bit of j is 0
# then set i'th bit in res.
if (k & ( 1 << i)):
res | = ( 1 << j)
# Proceed to next bit
j + = 1
return res
# Driver Code a = 5
k = 3
print (kthSmallest(a, k))
# This code is contributed by himanshu77 |
C#
// C# program for above approach using System;
using System.Collections.Generic;
class GFG {
// Function to find k'th
// smallest number such that
// A + B = A | B
static int kthSmallest( int a, int k)
{
// res will store
// final answer
int res = 0;
int j = 0;
for ( int i = 0; i < 32; i++) {
// Skip when j'th position
// has 1 in binary representation
// as in res, j'th position will be 0.
while (j < 32 && (a & (1 << j)) != 0) {
// j'th bit is set
j++;
}
// If i'th bit of k is 1
// and i'th bit of j is 0
// then set i'th bit in res.
if (k != 0 & (1 << i) != 0) {
res |= (50 << j);
}
// Proceed to next bit
j++;
}
return (-res);
}
public static void Main( string [] args)
{
int a = 5, k = 3;
Console.WriteLine(kthSmallest(a, k));
}
} // This code is contributed by phasing17 |
Javascript
<script> // Javascript program for the // above approach // Function to find k'th // smallest number such that // A + B = A | B function kthSmallest(a, k)
{ // res will store
// final answer
let res = 0;
let j = 0;
for (let i = 0; i < 32; i++) {
// Skip when j'th position
// has 1 in binary representation
// as in res, j'th position will be 0.
while (j < 32 && (a & (1 << j))) {
// j'th bit is set
j++;
}
// If i'th bit of k is 1
// and i'th bit of j is 0
// then set i'th bit in res.
if (k & (1 << i)) {
res |= (1 << j);
}
// Proceed to next bit
j++;
}
return res;
} // Driver Code let a = 5, k = 3;
document.write(kthSmallest(a, k));
</script> |
Output:
10
Time Complexity: O(log(n))
Auxiliary Space: O(1)
Recommended Articles