旧日支配者奈亚拉托提普对人类充满深深的恶意,他的力量超越人类的想象。毁灭日,奈亚拉托提普派遣了一个分身,意图毁灭人类,手持光明之剑的你却陷入了深深的思考。
在可以探知的方式中,唯有将奈亚拉托提普的分身吸入天国之门才能解除来自旧日的威胁,可是天国之门有它自身的运行法则,只有当分身们所具有的魔力总和为n时才会强行吸收旧日 的分身。而奈亚拉托提普并没有把人类放在眼里,因此只派出了1个魔力为1的分身来到地球。可是奈亚拉托提普毕竟是不死不灭的存在,每天白天,你都有一次挥剑机会,将奈亚拉托提普的任何数目的分身一分为二,每一个分裂开的分身将继承原本一半的魔力。每天晚上,奈亚拉托提普的每一个分身都将增加一点魔力。请你给出一种方法,使得奈亚拉托提普分身能够尽快被天国之门吸收。
输入: 2<=n<=1e9,表示天国之门产生作用的分身魔力总和。
输出: 第一行输出一个数字T,表示解除威胁最少消耗的天数。
第二行输出T个由空格符分开的数字d1,d2……dT,分别表示每天分裂的奈亚拉托提普分身个数。如果有多个答案,请输出任意一种。
补充说明:开始计数的时间为第一天的白天。(题目解法较多,请在代码前以注释形式给出数学思路。
读入数字n,将n 分解成 2^(log(n))+2^(log(n)-1)……2^(1)+2^(0)
dx魔力点总数==d(x-1)的魔力点数+dx分裂的分身个数 【其中dx分裂的分身个数<=d(x-1)的分身个数】
这道题可以使用广度优先搜索算法遍历寻找最短路径:
初始化【 魔力点数SumEnergy=1,分身总个数SumNumber=1】
每轮迭代【分身总个数SumNumber+=[前一日分身总个数~0] 魔力点数SumEnergy =【前一日魔力点数】+今日分身总个数 】
判断(如果【当日魔力点数】==【目标魔力总和n】)则(保存路径,递归返回)
判断(如果【当日魔力点数】>【目标魔力总和n】)则(方案失败,返回上级)
判断(如果【当日魔力点数】<【目标魔力总和n】)则(继续向下递归)
{备注:由于我们要求解的是最少天数,所以且分身的时候应该是前期尽可能多砍几个,迭代的时候SumNumber要从大到小来试}