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])