#P12572. [UOI 2023] An Array and Addition Again

    ID: 14139 远端评测题 1000ms 256MiB 尝试: 0 已通过: 0 显示难度提高 上传者: 标签>2023Special Judge构造UOI(乌克兰)

[UOI 2023] An Array and Addition Again

题目描述

给定一个编号从 11 到 100100 的数组 aa。初始时,对于 1≤i<1001 \leq i < 100 有 ai=0a_i = 0,最后一个元素 a100=1a_{100} = 1。

可以通过增量操作来修改数组 aa。要执行 mm 次增量操作,需要选择 mm 个整数 p1,p2,…,pmp_1, p_2, \dots, p_m(1≤pi<1001 \le p_i < 100),并按顺序执行赋值操作 api←(api+api+1)a_{p_i} \leftarrow (a_{p_i} + a_{p_i + 1})(ii 从 11 到 mm)。

给定一个整数 nn,找到一组增量操作序列,使得在执行完这些操作后,数组 aa 的第一个元素 a1a_1 等于 nn。

输入格式

第一行包含两个整数 tt 和 gg(1≤t≤1001 \le t \le 100,0≤g≤50 \leq g \leq 5)——分别表示输入数据的组数和测试块编号。

接下来的 tt 行,每行包含一个整数 nn(1≤n≤10181 \le n \le 10^{18})——在执行完增量操作后,a1a_1 应该达到的目标值。

输出格式

对于每组输入数据,第一行输出一个整数 mm(0≤m≤20000 \leq m \leq 2000)——增量操作的次数。

第二行输出 mm 个整数 pip_i(1≤pi<1001 \le p_i < 100)——增量操作的参数。

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

1 0
1
99
99 98 ... 7 6 5 4 3 2 1
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

提示

为了清晰起见,题目描述中的输入样例已被简化。要得到正确答案,请将 ...\tt{...} 替换为从 9797 到 88 的整数序列。

以第二个样例的第二组输入数据为例,其中 n=16n = 16。在执行以下操作后,数组 aa 的前 88 个元素的变化如下:

  • 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 次增量操作。

  • (44 分):n≤100n \leq 100;
  • (66 分):n=k2n = k^2,其中 1≤k≤1001 \le k \le 100;
  • (1010 分):n=(2k−1)n = (2^k - 1),其中 kk 为整数;
  • (1313 分):nn 是斐波那契数(即 nn 属于序列 1,1,2,3,5,8,13,21,34,…1, 1, 2, 3, 5, 8, 13, 21, 34, \dots);
  • (最多 6767 分):无额外限制。设使用的增量操作次数为 cc。如果 c≤300c \le 300,得 6767 分;否则得 $(17 + \left \lfloor \frac{2000 - c}{34} \right \rfloor)$ 分。

用于计算最后一个测试块得分的 C++\tt{C++} 代码如下:

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

翻译由 DeepSeek V3 完成