梅森数
题目描述:求解 2 n − 1 2^n-1 2n−1, ( 1000 < n < 3100000 ) (1000<n<3100000) (1000<n<3100000),求解该数的位数,以及后500位。
由于这个数一定超过了,long long的范围,所以一定要使用高进度算法,
第一次尝试,首先由于题目只要求解后 500 500 500位,但是我认为如果只求后 500 500 500位,好像并不能得出该数的位数,所以我还是求出每一位,然后再取前 500 500 500位。但是我认为这个算法必定会超时的,因为对于限制时间是一秒的,只能大概计算 1 0 8 10^8 108次,n最大时,会到 1 0 6 10^6 106,而这个数肯定会超过 1 0 2 10^2 102,所以一定会超时的。所以我去百度查了一下 2 n − 1 2^n-1 2n−1有啥特殊性质,发现有一个高中时经常见到的性质,
2 n − 1 = 2 0 + 2 1 + 2 2 + ⋅ ⋅ ⋅ + 2 n − 1 2^n-1=2^0+2^1+2^2+···+2^{n-1} 2n−1=20+21+22+⋅⋅⋅+2n−1,
证明:令 S = 2 0 + 2 1 + 2 2 + ⋅ ⋅ ⋅ + 2 n − 1 S=2^0+2^1+2^2+···+2^{n-1} S=20+21+22+⋅⋅⋅+2n−1,则 2 S = 2 1 + 2 2 + 2 3 + ⋅ ⋅ ⋅ + 2 n 2S=2^1+2^2+2^3+···+2^{n} 2S=
高精度快速幂(求梅森数)
最新推荐文章于 2020-02-26 19:57:17 发布