132. 大的循环单位数因子(Large repunit factors)
只包含数字1的数被称为循环单位数,我们定义\(R(k)\)是长为\(k\)的循环单位数。例如:
$$ R(10)=1111111111=11\times41\times271\times9091 $$这些质因数的和是9414,找出\(R(10^9)\)的前40个质因数的和。
分析:根据题意容易得知:
$$
R( k) =1+10+100+\cdots +10^{k-1} =\frac{10^{k} -1}{10-1} =\frac{10^{k} -1}{9}
$$
则\(R(k)\)的质因数即整除\(R(k)\)的素数,则有:
$$
R( k) \equiv 0(\bmod p) \Longrightarrow \frac{10^{k} -1}{9} \equiv 0(\bmod p) \Longrightarrow \ 10^{k} \equiv 1\ (\bmod 9p)
$$
为满足题意,即要求寻找四十个最小的素数\(p\),使得\( 10^{10^{9}}≡1(\mod{}9p)\)。使用\(pow()\)函数我们可以使用快速幂的方法很快求解余数。需要注意的是,所有数位全部是\(1\)的数肯定不能整除\(2\)和\(5\),所以这两个素数不用管。同时\(R(10^9)\)所有数位的和为\(10^9\)也不能整除三,所以也不考虑素数\(3\),则我们可以从素数\(7\)开始检验,只到找到四十个素数为止。代码如下:
# time cost = 242 ms ± 488 µs
from sympy import primerange
def main(N=10**9,k=40):
primes = [p for p in primerange(7,200000) if pow(10,N,p)==1]
return sum(primes[:k])