考虑依次操作 1,1,1,1,2,2,4,4,8,8,⋯。
维护一个 sum 表示我们现在知道 n 至少是 sum+1。
如果操作完变大那么直接更新 sum。
如果操作完变小了,把这次操作的数从 sum 中减去,然后直接执行 +sum,然后重新从 1 开始执行这个过程。
这样一轮是 O(logn) 的。每次操作 sum 都不降。容易发现只要 O(logn) 次就能求得 n。
int add(long long x);
bool cmp(int i,int j);
int solve()
#define int long long
{
int nw,pre=0;
int sum=0;
while(nw<2900)
{
int ps=sum;
pre=nw=add(sum);
for(int i=0;i<=30;i++)
{
int t=1<<(i==0?0:i-1);
nw=add(t);
if(cmp(nw,pre)==0)pre=nw,sum+=t;
else {sum-=t;break;}
nw=add(t);
if(cmp(nw,pre)==0)pre=nw,sum+=t;
else {sum-=t;break;}
}pre=nw;
}
return sum+2;
#undef int
}
这个做法可以弄到期望 1log,需要大约 190 次操作,无法通过。