Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

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

  • Difficulty Level : Hard
  • Last Updated : 22 Mar, 2021

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

 

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.

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

 

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

 




My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!