해당 연산을 최대 63번 사용해서 x의 값을 m으로 만들 수 있는지 판단하고 만들 수 있으면 만드는 과정을 출력하는 문제입니다.
케이스를 나눠서 생각해 봅시다. m의 bm번째 비트가 m에서 값이 1인 최상위 비트, n의 bn1, bn2번째 비트가 각각 n에서 값이 1인 최상위 비트, 두번째로 최상위 비트라고 하겠습니다. (n이 값이 1인 비트를 항상 두개 이상 가지고 있을 필요는 없으므로 bn2는 항상 존재하는 값은 아닙니다.)
Case 1) n에서 값이 1인 비트의 갯수가 1개일 때
이 경우 0<y<n인 모든 y에 대하여 (n⊕y)>n을 만족합니다. 즉, 연산을 시행할 수 없어 m을 만드는것이 불가능합니다.
Case 2) n의 bm번째 비트가 1일 때
이 때는 항상 (n⊕m)<n을 만족합니다. m<n이고 n⊕(n⊕m)=m을 만족하므로 연산에 n⊕m을 사용할 수 있습니다. 즉, 연산 1번으로 m을 만들 수 있습니다.
ny=n⊕mm
Case 3) n의 bm번째 비트가 0일 때
Case 3-1) bn2<bm<bn1일 때
우리가 수행할 수 있는 연산을 사용하면 할 수록 x의 값은 감소합니다. 즉, m을 만들기 위해서는 bn번째 비트를 언젠가 0으로 전환해야 되는데 이때 bm≤i<bn번째에 비트들 중 어느 하나라도 비트 값을 1로 바꿔주지 않으면 x의 값은 m보다 작아져 m을 만들 수 없게 됩니다. 그렇기 때문에 bn번째 비트를 0으로 바꿀 때 bm≤i<bn번째 비트들 중 적어도 하나 이상은 1로 바꿔줘야 합니다.
위 과정을 거지치 위해 사용해야 되는 값은 2bn−1+2i−1입니다. 그러나 이 값은 n을 초과합니다. 즉, 연산에 사용할 수 없고 다시 말해 위에서 언급한 과정을 수행할 수 없습니다. 그래서 이 경우에는 m을 만드는것이 불가능합니다.
Case 3-2) bm<bn2일 때
n에서 첫번째부터 bn2번째 비트까지 그대로 가져와서 만든 수를 n′이라고 하겠습니다. 그럼 (n′⊕m)<n이고 n⊕(n′⊕m)=2bn1−1+m<n이므로 연산을 시행해서 x=2bn1−1+m으로 만들 수 있습니다. 그리고 2bn1−1으로 연산을 한번 더 시행하면 x=m이 됩니다. 즉, 연산 2번으로 m을 만들 수 있습니다.
ny=n′⊕m2bn1−1+my=2bn1−1m
입력을 받으면 어느 케이스에 해당한지 판단한 후에 답을 출력하면 됩니다. 이 과정은 O(1)에 수행이 가능하고 전체 시간복잡도는 O(t)가 됩니다.