题目描述
关于我转生变成史莱姆这档事这部番剧中,上班族的三上悟因为某个事件而作为史莱姆在异世界转生了。在转生时得到了“大贤者”和“捕食者”这两个独特技能。虽然身为史莱姆,但也想和其他种族建立起友好关系。魔素是异世界里面魔物含有的魔力精华,捕食者这个技能就是吞噬魔素,捕食者的技能要求非常苛刻,如果你第一天吞噬了b魔素,那么你第二天可以吞噬第一天的2 ~ 9倍(必须是其中一个整数),也就是2b ~ 9b,也就是说,史莱姆在第i天所吞噬的魔素一定是第i-1天的2 ~ 9倍,而且还必须是它的整数倍。
作为史莱姆手下的得力助手,哥布林们准备了大量的魔物供主人食用,现在史莱姆已经知道了这些魔物含有S魔素,现在请大贤者合理安排第一天要吞噬和接下来每天需要增加的魔素倍数,好让史莱姆能在最短的天数内恰好吞噬完魔素。由于大贤者要研究“哲学”,无暇顾及这些小事,现在只能请你帮忙,但是大贤者还建议,这些魔素至少要用两天来吞噬。
输入
一个正整数S,代表要吞噬的魔素总量。
输出
一个数,代表要吞噬的天数,如果无解输出-1。
样例输入 Copy
571
样例输出 Copy
5
提示
对于30%数据,有S<=100;
对于70%数据,有S<=107;
对于100%数据,有9<S<=8×108
比赛的时候没做出来真的是不应该。
考虑 S = a + a * p1 + a * p1 * p2 + a * p1 * p2 * p3 + . . . . . .
有 S = a * ( 1 + p1 + p1 * p2 + p1 * p2 * p3 + . . . . . .)
其中后面一部分为 S 的因子,且根据题意,这一部分要 >= 3
再考虑
( 1 + p1 + p1 * p2 + p1 * p2 * p3 + . . . . . . )
我们去掉 1 之后还剩下 p1 + p1 * p2 + p1 * p2 * p3 + . . . . . . ,
那么 p1 也要是剩下数的一个因子且 2 <= p1 <= 9
以此类推,过程中再带点最优性剪枝。
实际上这样的时间复杂度已经很小了,因为要保证每次去掉 2–9 中的数是当前数的因子。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#incl