Related Articles

# Equal Sum and XOR

• Difficulty Level : Medium
• Last Updated : 31 Aug, 2021

Given a positive integer n, find count of positive integers i such that 0 <= i <= n and n+i = n^i

Examples :

```Input  : n = 7
Output : 1
Explanation:
7^i = 7+i holds only for only for i = 0
7+0 = 7^0 = 7

Input: n = 12
Output: 4
12^i = 12+i hold only for i = 0, 1, 2, 3
for i=0, 12+0 = 12^0 = 12
for i=1, 12+1 = 12^1 = 13
for i=2, 12+2 = 12^2 = 14
for i=3, 12+3 = 12^3 = 15```

Method 1 (Simple) :
One simple solution is to iterate over all values of i 0<= i <= n and count all satisfying values.

## C++

 `/* C++ program to print count of values such``   ``that n+i = n^i */``#include ``using` `namespace` `std;` `// function to count number of values less than``// equal to n that satisfy the given condition``int` `countValues (``int` `n)``{``    ``int` `countV = 0;` `    ``// Traverse all numbers from 0 to n and``    ``// increment result only when given condition``    ``// is satisfied.``    ``for` `(``int` `i=0; i<=n; i++ )``        ``if` `((n+i) == (n^i) )``            ``countV++;` `    ``return` `countV;``}` `// Driver program``int` `main()``{``    ``int` `n = 12;``    ``cout << countValues(n);``    ``return` `0;``}`

## Java

 `/* Java program to print count of values`` ``such that n+i = n^i */``import` `java.util.*;` `class` `GFG {``    ` `    ``// function to count number of values``    ``// less than equal to n that satisfy``    ``// the given condition``    ``public` `static` `int` `countValues (``int` `n)``    ``{``        ``int` `countV = ``0``;``     ` `        ``// Traverse all numbers from 0 to n``        ``// and increment result only when``        ``// given condition is satisfied.``        ``for` `(``int` `i = ``0``; i <= n; i++ )``            ``if` `((n + i) == (n ^ i) )``                ``countV++;``     ` `        ``return` `countV;``    ``}``    ` `    ``/* Driver program to test above function */``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `n = ``12``;``        ``System.out.println(countValues(n));``        ` `    ``}``}` `// This code is contributed by Arnav Kr. Mandal.`

## Python3

 `# Python3 program to print count``# of values such that n+i = n^i` `# function to count number``# of values less than``# equal to n that satisfy``# the given condition``def` `countValues (n):``    ``countV ``=` `0``;` `    ``# Traverse all numbers``    ``# from 0 to n and``    ``# increment result only``    ``# when given condition``    ``# is satisfied.``    ``for` `i ``in` `range``(n ``+` `1``):``        ``if` `((n ``+` `i) ``=``=` `(n ^ i)):``            ``countV ``+``=` `1``;` `    ``return` `countV;` `# Driver Code``n ``=` `12``;``print``(countValues(n));` `# This code is contributed by mits`

## C#

 `/* C# program to print count of values``such that n+i = n^i */``using` `System;` `class` `GFG {``    ` `    ``// function to count number of values``    ``// less than equal to n that satisfy``    ``// the given condition``    ``public` `static` `int` `countValues (``int` `n)``    ``{``        ``int` `countV = 0;``    ` `        ``// Traverse all numbers from 0 to n``        ``// and increment result only when``        ``// given condition is satisfied.``        ``for` `(``int` `i = 0; i <= n; i++ )``            ``if` `((n + i) == (n ^ i) )``                ``countV++;``    ` `        ``return` `countV;``    ``}``    ` `    ``/* Driver program to test above function */``    ``public` `static` `void` `Main()``    ``{``        ``int` `n = 12;``        ``Console.WriteLine(countValues(n));``        ` `    ``}``}` `// This code is contributed by anuj_67.`

## PHP

 ``

## Javascript

 ``

Output:

`4`

Method 2 (Efficient) :
An efficient solution is as follows

we know that (n+i)=(n^i)+2*(n&i)
So n + i = n ^ i implies n & i = 0
Hence our problem reduces to finding values of i such that n & i = 0. How to find count of such pairs? We can use the count of unset-bits in the binary representation of n. For n & i to be zero, i must unset all set-bits of n. If the kth bit is set at a particular in n, kth bit in i must be 0 always, else kth bit of i can be 0 or 1
Hence, total such combinations are 2^(count of unset bits in n)
For example, consider n = 12 (Binary representation : 1 1 0 0).
All possible values of i that can unset all bits of n are 0 0 0/1 0/1 where 0/1 implies either 0 or 1. Number of such values of i are 2^2 = 4.

The following is the program following the above idea.

## C++

 `/* c++ program to print count of values such``  ``that n+i = n^i */``#include ``using` `namespace` `std;` `// function to count number of values less than``// equal to n that satisfy the given condition``int` `countValues(``int` `n)``{``    ``// unset_bits keeps track of count of un-set``    ``// bits in binary representation of n``    ``int` `unset_bits=0;``    ``while` `(n)``    ``{``        ``if` `((n & 1) == 0)``            ``unset_bits++;``        ``n=n>>1;``    ``}` `    ``// Return 2 ^ unset_bits``    ``return` `1 << unset_bits;``}` `// Driver code``int` `main()``{``    ``int` `n = 12;``    ``cout << countValues(n);``    ``return` `0;``}`

## Java

 `/* Java program to print count of values``  ``such that n+i = n^i */``import` `java.util.*;` `class` `GFG {``    ` `    ``// function to count number of values``    ``// less than equal to n that satisfy``    ``// the given condition``    ``public` `static` `int` `countValues(``int` `n)``    ``{``        ``// unset_bits keeps track of count``        ``// of un-set bits in binary``        ``// representation of n``        ``int` `unset_bits=``0``;``        ``while` `(n > ``0``)``        ``{``            ``if` `((n & ``1``) == ``0``)``                ``unset_bits++;``            ``n=n>>``1``;``        ``}``     ` `        ``// Return 2 ^ unset_bits``        ``return` `1` `<< unset_bits;``    ``}``    ` `    ``/* Driver program to test above``    ``function */``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `n = ``12``;``        ``System.out.println(countValues(n));``          ` `    ``}``}``  ` `// This code is contributed by Arnav Kr. Mandal.`

## C#

 `/* C# program to print count of values``  ``such that n+i = n^i */``using` `System;``public` `class` `GFG {``    ` `    ``// function to count number of values``    ``// less than equal to n that satisfy``    ``// the given condition``    ``public` `static` `int` `countValues(``int` `n)``    ``{``      ` `        ``// unset_bits keeps track of count``        ``// of un-set bits in binary``        ``// representation of n``        ``int` `unset_bits=0;``        ``while` `(n > 0)``        ``{``            ``if` `((n & 1) == 0)``                ``unset_bits++;``            ``n=n>>1;``        ``}``     ` `        ``// Return 2 ^ unset_bits``        ``return` `1 << unset_bits;``    ``}``    ` `    ``/* Driver program to test above``    ``function */``    ``public` `static` `void` `Main(String[] args)``    ``{``        ``int` `n = 12;``        ``Console.WriteLine(countValues(n));``          ` `    ``}``}` `// This code is contributed by umadevi9616`

## Python3

 `# Python3 program to print count of values such``# that n+i = n^i` `# function to count number of values less than``# equal to n that satisfy the given condition``def` `countValues(n):``    ` `    ``# unset_bits keeps track of count of un-set``    ``# bits in binary representation of n``    ``unset_bits ``=` `0``    ` `    ``while``(n):``        ``if` `n & ``1` `=``=` `0``:``            ``unset_bits ``+``=` `1``        ``n ``=` `n >> ``1``        ` `    ``# Return 2 ^ unset_bits    ``    ``return` `1` `<< unset_bits` `# Driver code``if` `__name__``=``=``'__main__'``:``    ``n ``=` `12``    ``print``(countValues(n))` `# This code is contributed by rutvik`

## PHP

 `> 1;``    ``}` `    ``// Return 2 ^ unset_bits``    ``return` `1 << ``\$unset_bits``;``}` `// Driver code` `    ``\$n` `= 12;``    ``echo` `countValues(``\$n``);` `// This code is contributed``// by Anuj_67.``?>`

## Javascript

 ``

Output :

`4`

This article is contributed by Nikhil Chakravartula. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up