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:
- If k = 0, then N = 3.
- If k = 1, then N = 1.
- If k % 4 = 0, then N = k.
- 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