
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Count of Values of x^n for which n XOR x^n = x in C++
We are given a number n as input. The goal is to find values x such that condition (n xor x)=(nx) holds. Also x lies in range [0,n].
Let us understand with examples
Input − n=10
Output − Count of values of x <= n for which (n XOR x) = (n – x) are − 4
Explanation − Values of x with 10 xor x = 10-x − 0, 2, 8 and 10.
Input − n=15
Output − Count of values of x <= n for which (n XOR x) = (n – x) are − 16
Explanation − Values of x with 15 xor x = 15-x − 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 and 15.
Approach used in the below program is as follows
We will use two approaches. First naive approach using for loops. Start traversing from i=0 to i<=n for i as possible x’s. Now check if ( n - i == (n ^ i) //xor ). If true increment count.
Take integer variable n as input.
Function unique_pair(int arr[], int size) takes array and its length and returns the number of unique pairs such that in pair (arr[i],arr[j]) index i<j
Take the initial value of count as 0.
Take a set ‘se’ containing integer pairs. (set<pair<int, int>> se)
Start traversing arr[] using two for loops. from i=0 to i<size-1 and j=i+1 to j<size.
For each pair always i<j, add pair (arr[i],arr[j]) to ‘se’ using se.insert(make_pair(arr[i], arr[j]));
At the end of both for loop, update count=se.size().
Count now has a number of pairs in ‘se’. ( All are unique ).
Return count as result.
Efficient Approach
In this approach we will first convert n to its binary equivalent. We know that
1 xor 0 = 1-0
1 xor 1 = 1-1
But
0 xor 0 ≠ 0-1
0 xor 1 ≠ 0-1
So for every 1 in binary representation of n, there are 2 cases. For p ones in binary representation of n, there will be 2p values that satisfy the condition.
index i. Then add individual such counts for total unique pairs.
Take integer variable n as input.
Function unique_pair(int arr[], int size) takes array and its length and returns the number of unique pairs such that in pair (arr[i],arr[j]) index i<j
Take the initial value of count as 0.
Convert n to string using number=bitset<8>(n).to_string();
Take length=number.length().
Traverse string using for loop from index i=0 to i<length. For each 1 increment count.
Set count=pow(2,count) as final values of x.
Return count as result.
Example (naive approach)
#include<bits/stdc++.h> using namespace std; int count_values(int n){ int count = 0; for (int i = 0; i <= n; i++){ if (n - i == (n ^ i)){ count++; } } return count; } int main(){ int n = 25; cout<<"Count of values of x <= n for which (n XOR x) = (n – x) are: "<<count_values(n); return 0; }
Output
If we run the above code it will generate the following output −
Count of values of x <= n for which (n XOR x) = (n – x) are: 8
Example (Efficient Approach)
#include<bits/stdc++.h> using namespace std; int count_values(int n){ int count = 0; string number = bitset<8>(n).to_string(); int length = number.length(); for (int i = 0; i < length; i++){ if (number.at(i) == '1') { count++; } } count = (int)pow(2, count); return count; } int main(){ int n = 25; cout<<"Count of values of x <= n for which (n XOR x) = (n – x) are: "<<count_values(n); return 0; }
Output
If we run the above code it will generate the following output −
Count of values of x <= n for which (n XOR x) = (n – x) are: 8