题目描述
输入(PPP1000 < P < 31000001000 < P < 31000001000 < P < 3100000 ) ,计算2P−12^{P}-12P−1的位数和最后500位数字(用十进制高精度数表示)
刚开始,我是想着用vector,把2^p算出来的,可结果实在是太大,时间上也不允许,就可以先算出具体的位数,之后只算后500位即可。
我借鉴了别人的题解之后还是超时了(原谅本菜鸟)。。。
所以附上其他大神题解:
一、求位数
首先我们知道与有着相同的位数,因为2的次方满足了最后一位不为零的要求,所以减一后位数并不会改变,那么我们可以直接求的位数。那么怎么求位数呢?我们不妨设,根据的位数为,我们只要想办法把中的底数2改为10,指数加一就是位数了。由此想到用10的几次方来代替2,那么就不难想到,这样便可以把中的2代换掉,变为。根据乘方的原理,将p乘进去,原式便可化为我们最终想要的形式了,所以位数就是。(提醒一下,C++中cmath库自带log10()函数…)
二、求后500位