Suspicious logarithms

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

先阐述一下主要思路

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

我们来求解 z z z

y z ≤ x y^z≤x yzx,同时取log有 z ≤ l o g 2 x l o g 2 y z≤\frac{log_2x}{log_2y} zlog2ylog2x,由于 z z z是整数,所以有 z = ⌊ l o g 2 x l o g 2 y ⌋ z=\lfloor \frac{log_2x}{log_2y} \rfloor z=log2ylog2x,我们考虑 [ 2 y , 2 y + 1 − 1 ] [2^y,2^{y+1}-1] [2y,2y+11]中每一个数的 z z z,即考虑 [ ⌊ l o g 2 2 y l o g 2 y ⌋ , ⌊ l o g 2 2 y + 1 − 1 l o g 2 y ⌋ ] [\lfloor \frac{log_22^y}{log_2y} \rfloor,\lfloor \frac{log_22^{y+1}-1}{log_2y} \rfloor] [⌊log2ylog22y,log2ylog22y+11⌋],这个区间写成开区间(这里写成开区间是为了右端点好计算,但实际上右端点是有可能可以取到的)就是 [ ⌊ l o g 2 2 y l o g 2 y ⌋ , ⌊ l o g 2 2 y + 1 l o g 2 y ⌋ ) [\lfloor \frac{log_22^y}{log_2y} \rfloor,\lfloor \frac{log_22^{y+1}}{log_2y} \rfloor) [⌊log2ylog22y,log2ylog22y+1⌋),即 [ ⌊ y l o g 2 y ⌋ , ⌊ y + 1 l o g 2 y ⌋ ) [\lfloor \frac{y}{log_2y} \rfloor,\lfloor \frac{y+1}{log_2y} \rfloor) [⌊log2yy,log2yy+1⌋)

推到这里我在考场的时候认为两端就相等了, z z z只有唯一的取值。实际上不是的,完全有可能 ⌊ y l o g 2 y ⌋ \lfloor \frac{y}{log_2y} \rfloor log2yy比一个整数 N N N小一点点, ⌊ y + 1 l o g 2 y ⌋ \lfloor \frac{y+1}{log_2y} \rfloor log2yy+1 N N N大一点点,所以两者是可以相差 1 1 1的(注意也最多相差一,对于 y ≥ 2 y≥2 y2来说, 1 l o g 2 y \frac{1}{log_2 y} log2y1的增量不会超过 1 1 1

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

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

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

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

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

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

实在不会推到的话就打表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值