아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

외톨이 1

시간 제한3초메모리 제한512 MB

요약
이진수 n의 연속 구간 길이가 주어질 때, 1부터 n까지의 UFO 총합 sks(n)을 이진수 연속 구간 길이로 출력한다.
난이도

어려움10점 중 9점

유형
수학, 조합론, 동적 계획법, 구현
정답자
아직 제출이 없습니다

문제

xx가 00과 11로 이루어진 수열이라고 하자. 수열 xx에서 외톨이 1(UFO)이란, 수열에 등장하는 11 가운데 양 끝(가장 앞 또는 가장 뒤)에 있으면서 다른 어떤 11과도 인접하지 않는 11을 말한다. 예를 들어 수열 1000101010001010에는 UFO가 두 개, 수열 11010110001101011000에는 UFO가 없으며, 수열 10001000에는 UFO가 정확히 한 개 있다.

11부터 nn까지의 모든 수를 이진법으로 나타냈을 때 등장하는 UFO의 총 개수를 sks(n)sks(n)이라고 하자. 예를 들어 sks(5)=5sks(5)=5, sks(64)=59sks(64)=59, sks(128)=122sks(128)=122, sks(256)=249sks(256)=249이다.

매우 큰 수를 다루므로 수를 간결하게 표현한다. 양의 정수 xx의 이진 표현 (x)2(x)_2는 항상 11로 시작한다. 이때 xx의 간결 표현 REP(x)REP(x)는 같은 숫자가 연속으로 이어지는 각 구간의 길이를 순서대로 나열한 양의 정수 수열이다. 예를 들면 다음과 같다.

REP(460288)=REP(11100000110000000002)=(3,5,2,9)REP(460288) = REP(1110000011000000000_2) = (3, 5, 2, 9)

REP(408)=REP(1100110002)=(2,2,2,3)REP(408) = REP(110011000_2) = (2, 2, 2, 3)

REP(n)REP(n)이 주어질 때 REP(sks(n))REP(sks(n))을 구하는 프로그램을 작성하라.

입력

첫째 줄에 양의 정수 nn의 간결 표현의 길이를 나타내는 정수 kk (1≤k≤1061 \le k \le 10^6)가 주어진다. 둘째 줄에는 kk개의 정수 x1,x2,…,xkx_1, x_2, \ldots, x_k (0<xi≤1090 < x_i \le 10^9)가 공백 하나로 구분되어 주어지며, 이 수열이 nn의 간결 표현이다. x1+x2+⋯+xk≤109x_1 + x_2 + \cdots + x_k \le 10^9, 즉 0<n<21090 < n < 2^{10^9}임이 보장된다.

출력

두 줄을 출력한다. 첫째 줄에는 하나의 양의 정수 ll을 출력한다. 둘째 줄에는 ll개의 양의 정수 y1,y2,…,yly_1, y_2, \ldots, y_l을 공백 하나로 구분하여 출력하며, 이 수열은 sks(n)sks(n)의 간결 표현을 이룬다.

예제5

  1. 예제 1

    입력
    6
    1 1 1 1 1 1
    
    예상 출력
    5
    1 1 2 1 1
    
  2. 예제 2

    입력
    1
    1
    
    예상 출력
    1
    1
    
  3. 예제 3

    입력
    1
    2
    
    예상 출력
    2
    1 1
    
  4. 예제 4

    입력
    4
    2 2 2 3
    
    예상 출력
    5
    3 3 1 1 1
    
  5. 예제 5

    입력
    4
    3 5 2 9
    
    예상 출력
    7
    4 5 1 1 3 1 4