#HK5224. 「UOI 2023 Stage 4 Day2」数组与再次加法

「UOI 2023 Stage 4 Day2」数组与再次加法

题目描述

题目译自 Ukrainian Olympiads in Informatics 2023 Stage 4 Day2 T3. Масив і знову додавання

有一个数组 aa,其元素编号从 11100100。初始时,ai=0a_i = 0(对于 1i<1001 \leq i < 100),最后一个元素 a100a_{100} 等于 11

你可以通过增加操作来修改数组 aa。为了执行 mm增加操作,需要选择 mm 个整数 p1,p2,,pmp_1, p_2, \dots, p_m (1pi<100)(1 \le p_i < 100),然后按顺序执行赋值操作 api(api+api+1)a_{p_i} \leftarrow (a_{p_i} + a_{p_i + 1}),其中 ii11mm

给定一个整数 nn,找出一种增加操作序列,使得执行这些操作后,数组 aa 的第一个位置元素变为 nn

输入格式

输入的第一行包含两个整数 ttgg (1t100,0g5)(1 \le t \le 100, 0 \leq g \leq 5),分别表示输入数据组的数量和子任务编号。

接下来的 tt 行,每行包含一个整数 nn (1n1018)(1 \le n \le 10^{18}),表示在当前数据组中,执行增加操作a1a_1 应等于的值。

输出格式

对于每个数据组:

  • 第一行输出一个整数 mm (0m2000)(0 \leq m \leq 2000),表示增加操作的数量;
  • 第二行输出 mm 个整数 pip_i (1pi<100)(1 \le p_i < 100),表示增加操作的参数。

如果存在多个正确答案,可以输出任意一个。

1 0
1

99
99 98 ... 7 6 5 4 3 2 1

为了简化示例输出,在题目中使用了 ...,实际输出应替换为从 979788 的整数序列。

2 0
3
16

101
99 98 ... 7 6 5 4 3 2 1 1 1
103
99 98 ... 7 6 5 4 4 3 3 2 2 1 1

对于第二个样例的第二个数据组 n=16n = 16,数组 aa 的前 8 个元素在每次操作后的变化如下:

  • p1=99p_1 = 99, a=[0,0,0,0,0,0,0,0,,0,0,1,1]a = [0, 0, 0, 0, 0, 0, 0, 0, \ldots, 0, 0, 1, 1];
  • p2=98p_2 = 98, a=[0,0,0,0,0,0,0,0,,0,1,1,1]a = [0, 0, 0, 0, 0, 0, 0, 0, \ldots, 0, 1, 1, 1];
  • \ldots
  • p93=7p_{93} = 7, a=[0,0,0,0,0,0,1,1,,1,1,1,1]a = [0, 0, 0, 0, 0, 0, 1, 1, \ldots, 1, 1, 1, 1];
  • p94=6p_{94} = 6, a=[0,0,0,0,0,1,1,1,,1,1,1,1]a = [0, 0, 0, 0, 0, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p95=5p_{95} = 5, a=[0,0,0,0,1,1,1,1,,1,1,1,1]a = [0, 0, 0, 0, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p96=4p_{96} = 4, a=[0,0,0,1,1,1,1,1,,1,1,1,1]a = [0, 0, 0, 1, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p97=4p_{97} = 4, a=[0,0,0,2,1,1,1,1,,1,1,1,1]a = [0, 0, 0, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p98=3p_{98} = 3, a=[0,0,2,2,1,1,1,1,,1,1,1,1]a = [0, 0, 2, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p99=3p_{99} = 3, a=[0,0,4,2,1,1,1,1,,1,1,1,1]a = [0, 0, 4, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p100=2p_{100} = 2, a=[0,4,4,2,1,1,1,1,,1,1,1,1]a = [0, 4, 4, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p101=2p_{101} = 2, a=[0,8,4,2,1,1,1,1,,1,1,1,1]a = [0, 8, 4, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p102=1p_{102} = 1, a=[8,8,4,2,1,1,1,1,,1,1,1,1]a = [8, 8, 4, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1];
  • p103=1p_{103} = 1, a=[16,8,4,2,1,1,1,1,,1,1,1,1]a = [16, 8, 4, 2, 1, 1, 1, 1, \ldots, 1, 1, 1, 1]

数据范围与提示

在前四个子任务中,允许使用不超过 300 次增加操作

详细子任务附加限制及分值如下表所示:

子任务 分值 附加限制
11 44 n100n \leq 100
22 66 n=k2n = k^2(对于某个整数 1k1001 \le k \le 100
33 1010 n=(2k1)n = (2^k - 1)(对于某个整数 kk
44 1313 nn 为斐波那契数(nn 是斐波那契序列中的一个元素,序列为 1,1,2,3,5,8,13,21,34,1, 1, 2, 3, 5, 8, 13, 21, 34, \dots
55 6767 无附加限制

对于最后一个子任务,设最大使用的增加操作次数为 cc。如果 c300c \le 300,得 6767 分;否则得 (17+2000c34)(17 + \lfloor \frac{2000 - c}{34} \rfloor) 分。

C++ 代码计算最后一个子任务的分数:

((c <= 300) ? 67 : (17 + (2000 - c) / 34))