using
System;
class
GFG {
static
int
max(
int
a,
int
b,
int
c)
{
return
Math.Max(a, Math.Max(b, c));
}
static
int
bitCount(
int
N)
{
int
cnt = 0;
while
(N != 0) {
cnt++;
N >>= 1;
}
return
cnt;
}
static
int
at_position(
int
num,
int
pos)
{
int
bit = num & (1 << pos);
return
bit;
}
static
int
toggle(
int
num,
int
pos)
{
num ^= (1 << pos);
return
num;
}
static
void
minChangeToReachTaregetOR(
int
A,
int
B,
int
K,
int
T)
{
int
maxlen
= max(bitCount(A), bitCount(B), bitCount(T));
for
(
int
i = maxlen - 1; i >= 0; i--) {
int
bitA = at_position(A, i);
int
bitB = at_position(B, i);
int
bitT = at_position(T, i);
if
(bitT != 0) {
if
((bitA == 0) && (bitB == 0)) {
B = toggle(B, i);
K--;
}
}
else
{
if
(bitA != 0) {
A = toggle(A, i);
K--;
}
if
(bitB != 0) {
B = toggle(B, i);
K--;
}
}
}
if
(K < 0) {
Console.WriteLine(
"Not possible"
);
return
;
}
for
(
int
i = maxlen - 1; K > 0 && i >= 0; --i) {
int
bitA = at_position(A, i);
int
bitB = at_position(B, i);
int
bitT = at_position(T, i);
if
(bitT != 0) {
if
((bitA != 0) && (bitB != 0)) {
toggle(A, i);
K--;
}
}
if
((bitA != 0) && (bitB == 0) && K >= 2) {
toggle(A, i);
toggle(B, i);
K -= 2;
}
}
Console.WriteLine(A +
" "
+ B);
}
public
static
void
Main(
string
[] args)
{
int
A = 175, B = 66, K = 5, T = 100;
minChangeToReachTaregetOR(A, B, K, T);
}
}