0388 不同的直线
* * * *
拉格朗日计划
* * * *
不同的直线

考虑所有满足$0\le a,b,c\le N$的整点$(a,b,c)$。

从原点$O(0,0,0)$引直线穿过其它整点,记$D(N)$为所有不同直线的数目。

已知$D(10^6)=831909254469114121$。求$D(10^10)$的前九位和后九位数字相连所得的十八位数。

本题难度:



解答

给定范围内的非零整点共有$(N+1)^3-1$个,将这些点按$\gcd(a,b,c)$的值分成若干组,则有 \begin{align*} (N+1)^3-1&=\sum_{d=1}^N|\{(a,b,c): 0\le a,b,c\le N, (a,b,c)\neq 0,\gcd(a,b,c)=d\}| \\ &=\sum_{d=1}^N|\{(a,b,c)| 0\le a,b,c \le\lfloor\frac{N}{d}\rfloor,(a,b,c)\neq(0,0,0),\gcd(a,b,c)=1\}|\\ &=\sum_{d=1}^ND(\frac{N}{d}) \end{align*} 从而得递推式 $$D(N)=(N+1)^3-1-\sum_{d=2}^ND(\frac{N}{d}).$$ 递归计算即得结果$831907372805129931$。

注:以下代码使用cache装饰器作记忆化搜索,因此为Python 3代码,本题数据量较大,需要若干分钟运行。

from functools import *

target=10**10

@cache
def D(n):    
    t=(n+1)*(n+1)*(n+1)-1
    a=2
    while a<=n:
        b=n//(n//a)
        t-=D(n//a)*(b-a+1)
        a=b+1
    return t

s=str(D(target))
print(s[:9]+s[-9:])