0489 两序列公因数
* * * *
拉格朗日计划
* * * *
两序列公因数

给定$a,b$,记能使$\gcd(n^3+b, (n+a)^3+b)$取到最大值的最小非负整数$n$为$G(a, b)$。

例如$G(1,1)=5$,这是因为$\gcd(n^3+1, (n+1)^3+1)$在$n=5$时取得其最大值$7$。

令$H(m, n)=\sum_{a=1}^m\sum_{b=1}^nG(a, b)$,可以验证$H(5, 5)=128878, H(10, 10)=32936544$。

求$H(18, 1900)$。

本题难度:



解答

令$x=n^3+b, y= (n+a)^3+b$,用辗转相除法计算$ux+vy=w$可得$w=a^7+27ab^2=2^5\cdot 3^5\cdot 304357$,而$\gcd(x,y)$能整除$w$。

至此直接遍历$2^5\cdot 3^5\cdot 304357$的约数已经可以计算$n$,不过以下收录官网论坛中的另一种解法,速度较快:

选择合适的$u,v$可获得不同形式的$w$,例如$\gcd(x,y)$也能整除$y-x=3an^2+3a^2n+a^3$以及$(n+2a)x-(n-a)y=2a^3n+3ab+a^4$。

选择其中尽可能简单的值并再作一次辗转相除法即可更快确定$\gcd(x,y)$以及符合要求的$n$,最终结果是$1791954757162$。

注:以下代码改编自官网论坛,因使用math.gcd函数,代码为Python 3。

import math

def f(a,b,c):
    q,r=divmod(a,b)
    if r==0:
        return 0,c//b
    else:
        u,v=f(b,r,c)
        return v,u-q*v

res=0
for a in range(1,19):
    for b in range(1,1901):
        n,g=0,1
        p=a**6+27*b*b
        q=8*a**5
        r=4*a**6+12*b*a*a*a

        d=math.gcd(p,q)
        p,q,r=p//d,q//d,r//d

        _,m=f(p,-q,r)
        k=m//p
        for i in range(a):
            t=m-k*p
            if (x:=math.gcd((t+a)**3+b,t**3+b))>g:
                g=x
                n=t
            k-=1
        res+=n

print(res)