题目描述
题目译自 Ukrainian Olympiads in Informatics 2023 Stage 4 Day2 T3. Масив і знову додавання
有一个数组 a,其元素编号从 1 到 100。初始时,ai=0(对于 1≤i<100),最后一个元素 a100 等于 1。
你可以通过增加操作来修改数组 a。为了执行 m 次增加操作,需要选择 m 个整数 p1,p2,…,pm (1≤pi<100),然后按顺序执行赋值操作 api←(api+api+1),其中 i 从 1 到 m。
给定一个整数 n,找出一种增加操作序列,使得执行这些操作后,数组 a 的第一个位置元素变为 n。
输入格式
输入的第一行包含两个整数 t 和 g (1≤t≤100,0≤g≤5),分别表示输入数据组的数量和子任务编号。
接下来的 t 行,每行包含一个整数 n (1≤n≤1018),表示在当前数据组中,执行增加操作后 a1 应等于的值。
输出格式
对于每个数据组:
- 第一行输出一个整数 m (0≤m≤2000),表示增加操作的数量;
- 第二行输出 m 个整数 pi (1≤pi<100),表示增加操作的参数。
如果存在多个正确答案,可以输出任意一个。
1 0
1
99
99 98 ... 7 6 5 4 3 2 1
为了简化示例输出,在题目中使用了 ...,实际输出应替换为从 97 到 8 的整数序列。
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=16,数组 a 的前 8 个元素在每次操作后的变化如下:
- p1=99, a=[0,0,0,0,0,0,0,0,…,0,0,1,1];
- p2=98, a=[0,0,0,0,0,0,0,0,…,0,1,1,1];
- …
- p93=7, a=[0,0,0,0,0,0,1,1,…,1,1,1,1];
- p94=6, a=[0,0,0,0,0,1,1,1,…,1,1,1,1];
- p95=5, a=[0,0,0,0,1,1,1,1,…,1,1,1,1];
- p96=4, a=[0,0,0,1,1,1,1,1,…,1,1,1,1];
- p97=4, a=[0,0,0,2,1,1,1,1,…,1,1,1,1];
- p98=3, a=[0,0,2,2,1,1,1,1,…,1,1,1,1];
- p99=3, a=[0,0,4,2,1,1,1,1,…,1,1,1,1];
- p100=2, a=[0,4,4,2,1,1,1,1,…,1,1,1,1];
- p101=2, a=[0,8,4,2,1,1,1,1,…,1,1,1,1];
- p102=1, a=[8,8,4,2,1,1,1,1,…,1,1,1,1];
- p103=1, a=[16,8,4,2,1,1,1,1,…,1,1,1,1]。
数据范围与提示
在前四个子任务中,允许使用不超过 300 次的增加操作。
详细子任务附加限制及分值如下表所示:
| 子任务 |
分值 |
附加限制 |
| 1 |
4 |
n≤100 |
| 2 |
6 |
n=k2(对于某个整数 1≤k≤100) |
| 3 |
10 |
n=(2k−1)(对于某个整数 k) |
| 4 |
13 |
n 为斐波那契数(n 是斐波那契序列中的一个元素,序列为 1,1,2,3,5,8,13,21,34,…) |
| 5 |
67 |
无附加限制 |
对于最后一个子任务,设最大使用的增加操作次数为 c。如果 c≤300,得 67 分;否则得 (17+⌊342000−c⌋) 分。
C++ 代码计算最后一个子任务的分数:
((c <= 300) ? 67 : (17 + (2000 - c) / 34))