思路
40分
显然对于 n ≤ 10 n\leq10 n≤10,易证得区间 [ 1 , 10 ] [1,10] [1,10]内能进行优秀的拆分的数最多只需用 2 x 1 + 2 x 2 , ( x 2 > x 1 ⩾ 0 ) 2^{x_1}+2^{x_2},(x_2 >x_1 \geqslant0) 2x1+2x2,(x2>x1⩾0)便可以表示,可能的组合仅有:
10=23+21+8+2
8=23
6=22+21=4+2
4=22
2=21
因此只需特判n是否为以上数即可。
在此基础上:对于数
2
x
+
1
,
(
x
∈
N
)
2x+1,(x\in\mathbb{N})
2x+1,(x∈N)显然可化简为
2
x
+
2
0
2x+2^0
2x+20,而由题意该式含有
2
0
2^0
20,不能进行优秀的拆分,所有对于奇数,只需特判输出-1
即可。
此刻我们通过特判拿到了40分。
100分
首先对于n为奇数的情况下我们依然输出-1
,否则我们可直接枚举
2
x
2^x
2x中的
x
x
x,从大往小枚举。对于
2
x
i
2^{x_i}
2xi如果
2
x
i
≤
n
2^{x_i}\leq n
2xi≤n,可暂时视为一种可行解记录,并从
n
n
n中扣除。如果
n
n
n最后只剩下
0
0
0,那么显然它可以进行优秀的拆分,只需输出所有记录下来的可行解即可,否则输出-1
,当然你也可以预处理2的幂。
需注意的是:因为 l o g 2 1 0 7 log_{2}{10^7} log2107约等于24,所以我们从 2 24 2^{24} 224开始枚举。
代码
40分代码:点击此处
100分代码(边做边算):点击此处(需注意,这里用了快速幂优化了一下)
100分代码(预处理2的幂):点击此处