#P50583. 「POI2010」01 序列计数 Ones

「POI2010」01 序列计数 Ones

题目描述

译自 POI 2010 Stage 3. Day 2「Ones

xx 是一个由 01 组成的序列。一个 UFO 指的是序列中第一个 1 或者最后一个 1 且不和任何一个 1 相邻。例如 10001010 有两个 UFO,1101011000 没有 UFO,1000 只有一个 UFO。

11nn 的数的二进制表示中 UFO 的总数为 sks(n)sks(n)。例如,sks(5)=5,sks(64)=59,sks(128)=122,sks(256)=249sks(5) = 5, sks(64) = 59, sks(128) = 122, sks(256) = 249

我们需要处理非常大的数字。因此 nn 会用压缩的形式表示。设 xx 是一个正整数,x2x_2 是其二进制表示(最高位为 1),则该数的压缩形式 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))

输入格式

第一行有一个整数 kk ,表示一个正整数 nn 的压缩形式。 接下来一行有 kk 个整数 x1,x2,...,xkx_1, x_2, ..., x_k ,用空格分隔,表示 nn 的压缩形式序列。保证 x1+x2+...+xk1000000000x_1 + x_2 + ... + x_k \le 1000000000,也就是说 0<n<210000000000 \lt n \lt 2^{1000000000}

输出格式

输出两行,第一行有一个正整数 ll,第二行有 ll 个正整数 y1,y2,...,yly_1, y_2, ..., y_l,用空格分隔,表示 sks(n)sks(n) 的压缩形式。

样例

6
1 1 1 1 1 1
5
1 1 2 1 1

序列 1,1,1,1,1,11,1,1,1,1,11010102=42101010_2 = 42 的压缩形式,sks(42)=45sks(42) = 45,而 45=101101245 = 101101_2 的压缩形式为 1,1,2,1,11,1,2,1,1.

数据范围与提示

对于 100%100\% 的数据, 1k1000000,0<xi10000000001 \le k \le 1000000 , 0 \lt x_i \le 1000000000

Translated by vincent163