Project Euler 304
Project Euler 304
题目
Primonacci
For any positive integer \(n\) the function \(\text{next-prime}(n)\) returns the smallest prime \(p\) such that \(p>n\).
The sequence \(a(n)\) is defined by:\(a(1)=\text{next-prime}(10^{14})\) and \(a(n)=\text{next-prime}(a(n-1))\) for \(n>1\).
The fibonacci sequence \(f(n)\) is defined by: \(f(0)=0, f(1)=1\) and \(f(n)=f(n-1)+f(n-2)\) for \(n>1\).
The sequence \(b(n)\) is defined as \(f(a(n))\).
Find \(\sum b(n)\) for \(1\le n\le100 000\). Give your answer \(\bmod\ 1234567891011\).
解决方案
将斐波那契数的通项公式写成矩阵形式:
\[ \begin{bmatrix} 0 & 1\\ 1 & 1 \end{bmatrix} \begin{bmatrix} f(i-2)\\ f(i-1) \end{bmatrix} = \begin{bmatrix} f(i-1)\\ f(i) \end{bmatrix} \]
令\(B=\begin{bmatrix} 0 & 1\\ 1 & 1 \end{bmatrix}\),那么通过矩阵快速幂,可以\(O(\log n)\)的时间复杂度内求解出第\(n\)项的值。
另外,上面的等式可以写成
\[ B^d \begin{bmatrix} f(i-d-1)\\ f(i-d) \end{bmatrix} = \begin{bmatrix} f(i-1)\\ f(i) \end{bmatrix} \]
这\(10^5\)次的询问是独立的,并且之间的间隔\(d\)也比较小。我们可以基于上式来减少矩阵乘法的运算次数,用上一次的结果继续转移,计算出当前结果。
求一个数的下一个质数,使用sympy
的nextprime
方法。
代码
1 | from sympy import nextprime |