Project Euler 443
Project Euler 443
题目
GCD sequence
Let $g(n)$ be a sequence defined as follows:
$g(4) = 13$,
$g(n) = g(n-1) + \gcd(n, g(n-1))$, for $n > 4$.
The first few values are:
| $n$ | $4$ | $5$ | $6$ | $7$ | $8$ | $9$ | $10$ | $11$ | $12$ | $13$ | $14$ | $15$ | $16$ | $17$ | $18$ | $19$ | $20$ | $\dots$ |
| $g(n)$ | $13$ | $14$ | $16$ | $17$ | $18$ | $27$ | $28$ | $29$ | $30$ | $31$ | $32$ | $33$ | $34$ | $51$ | $54$ | $55$ | $60$ | $\dots$ |
You are given that $g(1000) = 2524$ and $g(1000000) = 2624152$.
Find $g(10^{15})$.
解决方案
令$N=10^{15}$,将$g$中的前一部分项打印出来,发现对于绝大多数$n$,都满足$g(n)=g(n-1)+1$。
因此,我们考虑枚举出所有满足$\gcd(n,g(n-1))>1$的所有$n$,并找到这些$n$中最大的一个使得$n\le N$,那么$g(N)=g(n)+N-n.$
假设目前我们已经知道了某个$n$和它的函数值$g$,那么转为求下一个最小的$n’$使得$\gcd(n’,g(n’-1))>1,n’>n$,那么在$d=n+1,n+2,\dots,n’-1$之前,都满足$\gcd(d,g(d-1))=1$。
那么对于一对$n,g$,问题转化成求一个最小的$k$,使得$\gcd(n+k+1,g+k)>1$.根据辗转相除的性质,可以写为$\gcd(g+k,g-n-1)>1$.
可以发现,$g-n-1$是一个常数。因此我们将$g-n-1$进行分解,并枚举每个质因数$p_i$,并求出最小的$k_i$使得$g+k_i$是$p_i$的倍数,最终$k$是这些$k_i$中最小的一个。
令$n’=n+k+1$,那么$g’=n+k+\gcd(n+k+1,g+k)$,得到了一组新的$n’,g(n)$值,由此迭代直到$N$处。
代码
1 | from tools import factorization, gcd |