2020CSP-J T1优秀的拆分题解

题目传送门

思路

40分

显然对于 n ≤ 10 n\leq10 n10,易证得区间 [ 1 , 10 ] [1,10] [110]内能进行优秀的拆分的数最多只需用 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>x10)便可以表示,可能的组合仅有:

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(xN)显然可化简为 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 2xin,可暂时视为一种可行解记录,并从 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的幂):点击此处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值