# Equal Sum and XOR

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
```

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

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

 ` `

Output:

`4`

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

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; ` ` `  `class` `GFG  ` `{ ` `     `  `    ``// function to count number of  ` `    ``// values less than equal to n  ` `    ``// that satisfy the given condition ` `    ``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 Code ` `    ``public` `static` `void` `Main()  ` `    ``{ ` `        ``int` `n = 12; ` `        ``Console.Write(countValues(n)); ` `    ``} ` `} ` ` `  `// This code is contributed by Anuj_67. `

## PHP

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

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 contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

My Personal Notes arrow_drop_up

Improved By : jit_t, vt_m, Mithun Kumar

Article Tags :
Practice Tags :

7

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.