[codeforces] 1934D1. XOR Break — Solo Version

starbow·2024년 5월 31일

PS/CP

목록 보기
7/25

문제 링크

초기값이 nn인 정수 변수 xx가 있습니다. 저희는 xx에 대해 다음 연산을 수행합니다.

  • 0<y<x0 < y < x이면서 0<(xy)<x0 < (x \oplus y) < x인 정수 yy를 선택합니다.
  • xxyy 또는 xyx \oplus y로 업데이트 합니다.

해당 연산을 최대 63번 사용해서 xx의 값을 mm으로 만들 수 있는지 판단하고 만들 수 있으면 만드는 과정을 출력하는 문제입니다.

케이스를 나눠서 생각해 봅시다. mmbmbm번째 비트가 mm에서 값이 11인 최상위 비트, nnbn1bn_{1}, bn2bn_{2}번째 비트가 각각 nn에서 값이 11인 최상위 비트, 두번째로 최상위 비트라고 하겠습니다. (nn이 값이 11인 비트를 항상 두개 이상 가지고 있을 필요는 없으므로 bn2bn_{2}는 항상 존재하는 값은 아닙니다.)

Case 1) nn에서 값이 11인 비트의 갯수가 11개일 때

이 경우 0<y<n0 < y < n인 모든 yy에 대하여 (ny)>n(n \oplus y) > n을 만족합니다. 즉, 연산을 시행할 수 없어 mm을 만드는것이 불가능합니다.

Case 2) nnbmbm번째 비트가 11일 때

이 때는 항상 (nm)<n(n \oplus m) < n을 만족합니다. m<nm < n이고 n(nm)=mn \oplus (n \oplus m) = m을 만족하므로 연산에 nmn \oplus m을 사용할 수 있습니다. 즉, 연산 1번으로 mm을 만들 수 있습니다.

ny=nmmn \xrightarrow{y \, = \, n \oplus m} m

Case 3) nnbmbm번째 비트가 00일 때

Case 3-1) bn2<bm<bn1bn_{2} < bm < bn_{1}일 때

우리가 수행할 수 있는 연산을 사용하면 할 수록 xx의 값은 감소합니다. 즉, mm을 만들기 위해서는 bnbn번째 비트를 언젠가 00으로 전환해야 되는데 이때 bmi<bnbm \leq i < bn번째에 비트들 중 어느 하나라도 비트 값을 11로 바꿔주지 않으면 xx의 값은 mm보다 작아져 mm을 만들 수 없게 됩니다. 그렇기 때문에 bnbn번째 비트를 00으로 바꿀 때 bmi<bnbm \leq i < bn번째 비트들 중 적어도 하나 이상은 11로 바꿔줘야 합니다.
위 과정을 거지치 위해 사용해야 되는 값은 2bn1+2i12^{bn-1} + 2^{i-1}입니다. 그러나 이 값은 nn을 초과합니다. 즉, 연산에 사용할 수 없고 다시 말해 위에서 언급한 과정을 수행할 수 없습니다. 그래서 이 경우에는 mm을 만드는것이 불가능합니다.

Case 3-2) bm<bn2bm < bn_{2}일 때

nn에서 첫번째부터 bn2bn_{2}번째 비트까지 그대로 가져와서 만든 수를 nn'이라고 하겠습니다. 그럼 (nm)<n(n' \oplus m) < n이고 n(nm)=2bn11+m<nn \oplus (n' \oplus m) = 2^{bn_{1}-1} + m < n이므로 연산을 시행해서 x=2bn11+mx = 2^{bn_{1}-1} + m으로 만들 수 있습니다. 그리고 2bn112^{bn_{1}-1}으로 연산을 한번 더 시행하면 x=mx = m이 됩니다. 즉, 연산 2번으로 mm을 만들 수 있습니다.

ny=nm2bn11+my=2bn11mn \xrightarrow{y \, = \, n' \oplus m} 2^{bn_{1}-1} + m \xrightarrow{y \, = \, 2^{bn_{1}-1}} m

입력을 받으면 어느 케이스에 해당한지 판단한 후에 답을 출력하면 됩니다. 이 과정은 O(1)O(1)에 수행이 가능하고 전체 시간복잡도는 O(t)O(t)가 됩니다.

profile
🎈 Journey of problem solving

0개의 댓글