B. Candies

$n$에서부터 줄여나간다.

일단 짝수는 불가능하다. 항상 홀수만 나오기 때문이다.

그렇지 않다면 모든 홀수가 가능하다.

무지성으로 대충 $n \equiv 1 \pmod 4$면 $2x-1$ 연산을 사용한 것으로 치고 $n \equiv 3 \pmod 4$ 라면 $2x+1$ 연산을 사용한 것으로 쳤더니 통과됐다.

void solve() {
   int n;
   cin >> n;
   if (n % 2 == 0) {
      cout << "-1\n";
      return;
   }
   vi ans;
   while (n != 1) {
      if (n % 4 == 3) {
         ans.pb(2);
         n /= 2;
      } else {
         ans.pb(1);
         n = (n + 1) / 2;
      }
   }
   reverse(all(ans));
   cout << sz(ans) << endl;
   for (int i: ans) cout << i << ' ';
   cout << endl;
}

에디토리얼 풀이

$2x+1$ 이나 $2x-1$ 라는 연산은 이진수로 표현했을 때 가장 오른쪽 비트 $2^0$의 왼쪽에 $1$ 을 끼워넣거나 $0$ 을 끼워넣는 연산임을 알 수 있다.

void solve() {  
   int n;  
   cin >> n;  
   if (n % 2 == 0) {  
      cout << -1 << endl;  
   } else {  
      vi ans;  
      for (int i = 1; i < 30; i++) {  
         if ((1 << i) > n) break;  
         if (n & (1 << i)) ans.pb(2);  
         else ans.pb(1);  
      }  
      reverse(all(ans));  
      cout << sz(ans) << endl;  
      for (int i: ans) cout << i << ' ';  
      cout << endl;  
   }  
}

Comments