这道题目真的。。。哎

先阐述一下主要思路

很显然\(y\)是可以通过按位确定的,所以我们枚举\(y\),那么当前考虑的数的范围就是\([2^y,2^{y+1}-1]\)

我们来求解\(z\)

有$$y^z≤x$$,同时取log有$$z≤\frac{log_2x}{log_2y}$$,由于\(z\)是整数,所以有$$z=\lfloor \frac{log_2x}{log_2y} \rfloor$$,我们考虑\([2^y,2^{y+1}-1]\)中每一个数的\(z\),即考虑$$[\lfloor \frac{log_22^y}{log_2y} \rfloor,\lfloor \frac{log_22^{y+1}-1}{log_2y} \rfloor]$$,这个区间写成开区间就是$$[\lfloor \frac{log_22^y}{log_2y} \rfloor,\lfloor \frac{log_22^{y+1}}{log_2y} \rfloor)$$,即$$[\lfloor \frac{y}{log_2y} \rfloor,\lfloor \frac{y+1}{log_2y} \rfloor)$$

推到这里我在考场的时候认为两端就相等了,\(z\)只有唯一的取值。实际上不是的,完全有可能\(\lfloor \frac{y}{log_2y} \rfloor\)比一个整数\(N\)小一点点,\(\lfloor \frac{y+1}{log_2y} \rfloor\)\(N\)大一点点,所以两者是可以相差\(1\)

然后我们开始写代码,我居然直接用log2函数。。这个东西的类型是double的,有效数字为\(17\)~\(18\)位,而\(10^{18}\)是会炸的。。。

那怎么办?我居然还想到每一次用一个循环的手写pow函数去跑,果然超时了。。。

中途还用了二分去寻找那个分界点,属于是唐完了,TLE

实际上分界点是好确定的,我们设$$p=y^{\lfloor \frac{y}{log_2y} \rfloor}$$,那么分界点显然就是\(p\times y\)了。。。直接变\(O(1)\)

循环的pow函数也可以预处理

CF提交的若干次代码都看一看吧,这种错误真不能犯了

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。