Open In App

Minimum value of N such that xor from 1 to N is equal to K

Improve
Improve
Like Article
Like
Save
Share
Report

Given a value K which is the XOR of all the values from 1 to N, the task is to find the minimum value of N such that XOR from 1 to N is equal to K.
Examples
 

Input: K = 7
Output: 6
1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 = 7

Input: K = 10
Output: Not Possible

 

Approach: This problem is similar to the Calculate XOR from 1 to n. Below are the conditions to be checked: 
 

  1. If k = 0, then N = 3.
  2. If k = 1, then N = 1.
  3. If k % 4 = 0, then N = k.
  4. If k % 4 = 3, then N = k-1.

Below is the implementation of above approach: 
 

C++




// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the value of N
int findN(int k)
{
     
    // variable to store the result
    int ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely divided by
    // 4 then minimum 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4 gives 3 as
    // remainder then minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to get
    // k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
int main()
{
    // let the given number be 7
    int k = 7;
 
    int res = findN(k);
    if (res == -1)
        cout << "Not possible";
    else
        cout << res;
 
    return 0;
}


Java




// Java implementation of
// above approach
import java.io.*;
 
class GFG
{
 
// Function to find the
// value of N
static int findN(int k)
{
     
    // variable to store
    // the result
    int ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely
    // divided by 4 then minimum
    // 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4
    // gives 3 as remainder then
    // minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to
    // get k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
public static void main (String[] args)
{
    // let the given number be 7
    int k = 7;
     
    int res = findN(k);
    if (res == -1)
        System.out.println("Not possible");
    else
        System.out.println(res);
}
}
 
// This code is contributed
// by inder_verma


Python3




# Python3 implementation of
# above approach
 
# Function to find the value of N
def findN(k) :
 
    # handling case for '0'
    if (k == 0) :
        ans = 3
 
    # handling case for '1'
    if (k == 1) :
        ans = 1
 
    # when number is completely
    # divided by 4 then minimum
    # 'x' will be 'k'
    elif (k % 4 == 0) :
        ans = k
 
    # when number divided by 4
    # gives 3 as remainder then
    # minimum 'x' will be 'k-1'
    elif (k % 4 == 3) :
        ans = k - 1
 
    # else it is not possible to 
    # get k for any value of x
    else:
        ans = -1
 
    return ans
 
# Driver code
 
# let the given number be 7
k = 7
 
res = findN(k)
if (res == -1):
    print("Not possible")
else:
    print(res)
 
# This code is contributed
# by Smitha


C#




// C# implementation of
// above approach
using System;
 
class GFG
{
 
// Function to find the
// value of N
static int findN(int k)
{
     
    // variable to store
    // the result
    int ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely
    // divided by 4 then minimum
    // 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4
    // gives 3 as remainder then
    // minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to
    // get k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
public static void Main ()
{
    // let the given number be 7
    int k = 7;
     
    int res = findN(k);
    if (res == -1)
        Console.WriteLine("Not possible");
    else
        Console.WriteLine(res);
}
}
 
// This code is contributed
// by inder_verma


PHP




<?php
// PHP implementation of above approach
 
// Function to find the value of N
function findN($k)
{
     
    // variable to store the result
    $ans;
 
    // handling case for '0'
    if ($k == 0)
        $ans = 3;
 
    // handling case for '1'
    if ($k == 1)
        $ans = 1;
 
    // when number is completely divided
    // by 4 then minimum 'x' will be 'k'
    else if ($k % 4 == 0)
        $ans = $k;
 
    // when number divided by 4 gives 3 as
    // remainder then minimum 'x' will be 'k-1'
    else if ($k % 4 == 3)
        $ans = $k - 1;
 
    // else it is not possible to
    // get k for any value of x
    else
        $ans = -1;
 
    return $ans;
}
 
// Driver code
 
// let the given number be 7
$k = 7;
 
$res = findN($k);
if ($res == -1)
    echo "Not possible";
else
    echo $res;
 
// This code is contributed by Mahadev
?>


Javascript




<script>
// javascript implementation of
// above approach
 
 
// Function to find the
// value of N
function findN(k)
{
     
    // variable to store
    // the result
    var ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely
    // divided by 4 then minimum
    // 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4
    // gives 3 as remainder then
    // minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to
    // get k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
// let the given number be 7
var k = 7;
 
var res = findN(k);
if (res == -1)
    document.write("Not possible");
else
    document.write(res);
 
 
// This code contributed by shikhasingrajput
</script>


Output: 

6

 

Time Complexity: O(1)

Auxiliary Space: O(1)

How does this work? 
When we do XOR of numbers, we get 0 as XOR value just before a multiple of 4. This keeps repeating before every multiple of 4. 
 

Number Binary-Repr  XOR-from-1-to-n
1         1           [0001]
2        10           [0011]
3        11           [0000]  <----- We get a 0
4       100           [0100]  <----- Equals to n
5       101           [0001]
6       110           [0111]
7       111           [0000]  <----- We get 0
8      1000           [1000]  <----- Equals to n
9      1001           [0001]
10     1010           [1011]
11     1011           [0000] <------ We get 0
12     1100           [1100] <------ Equals to n

 



Last Updated : 31 Aug, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads