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

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

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

/* C++ program to print count of values such
   that n+i = n^i */
#include <iostream>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP 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
function countValues ($n)
{
    $countV = 0;
  
    // Traverse all numbers
    // from 0 to n and
    // increment result only
    // when given condition
    // is satisfied.
    for ($i = 0; $i <= $n; $i++ )
        if (($n + $i) == ($n^$i) )
            $countV++;
  
    return $countV;
}
  
    // Driver Code
    $n = 12;
    echo countValues($n);
  
// This code is contributed by m_kit
?>

chevron_right



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

filter_none

edit
close

play_arrow

link
brightness_4
code

/* c++ program to print count of values such
  that n+i = n^i */
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

/* 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.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
/* PHP 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
function 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++;
        $n = $n >> 1;
    }
  
    // Return 2 ^ unset_bits
    return 1 << $unset_bits;
}
  
// Driver code
  
    $n = 12;
    echo countValues($n);
  
// This code is contributed
// by Anuj_67.
?>

chevron_right



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.