Suspicious logarithms

这道题目告诉我们,数学题能列式子的,化简的,一定要耐心做,最后就能看出来了

先阐述一下主要思路

很显然\(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\)的(注意也最多相差一,对于\(y≥2\)来说,\(\frac{1}{log_2 y}\)的增量不会超过\(1\)

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

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

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

实际上分界点是好确定的,我们设$$\lfloor \frac{log_2p}{log_2y} \rfloor=\lfloor \frac{y}{log_2y} \rfloor,p=y^{\lfloor \frac{y}{log_2y} \rfloor}$$,由于最多相差\(1\),那么分界点就是\(p\times y\)了。。。直接变\(O(1)\)(当然最开始也可以设\(\lfloor \frac{log_2p}{log_2y} \rfloor=\lfloor \frac{y+1}{log_2y} \rfloor\),直接解出分界点)

循环的pow函数也可以预处理(如何计算\(\lfloor \frac{y}{log_2y} \rfloor\)?设\(x≤\frac{y}{log_2y}\),即\(y^x≤2^y\),循环\(x\)即可)

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

实在不会推到的话就打表

posted @ 2024-03-13 00:11  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报