0342 平方与立方
* * * *
拉格朗日计划
* * * *
平方与立方

用$\varphi$表示欧拉Totient函数,则有$\varphi(50^2)=2\times 5^3\times 1\times 4=10^3$是立方数。

求所有满足$1 < n < 10^{10}$且$\phi(n^2)$为立方数的n之和。

本题难度:



解答

先用筛法找出给定范围内的素数,再从大到小依次考虑以第k个素数$p_k$为最大素因子的数,枚举$p_k$的幂并作深度优先搜索。

搜索时注意到$\varphi(n^2)=n\varphi(n)$,因此若$p_k$在n中的幂是$a_k$,那么它在$\varphi(n^2)$中的幂是$2a_k-1$。

以$(k, n, \varphi(n))$作为搜索状态,$\varphi(n)$中还会产生因子$p_k-1$,对该因子的分解可以递延到之后的搜索步骤。

最终结果是$5943040885644$。

注:以下代码为Python 3。本题递归深度超过了系统默认值,需要用sys.setrecursionlimit重新设置。大约需要数分钟运行,但因递归进度难以估计,因此未打印进度。

import sys
sys.setrecursionlimit(10**6)

bound=10**10
target=100000

d=[0]*target
n=2
while n < target:
    for i in range(n*n,target,n):
        d[i]=d[i]+1
    n=n+1
    while n < target and d[n]>0:
        n=n+1

primeList=[k for k in range(2,target) if d[k]==0]

def check(k,n,phi):
    if k < 0:
        return n
    t=phi
    c=0
    while t%primeList[k]==0:
        t//=primeList[k]
        c+=1
    c%=3 
    r=check(k-1,n,phi) if c==0 else 0
    x=1
    n*=primeList[k]
    while n < bound:
        if (x+x-1+c)%3==0:
            r+=check(k-1,n,phi*(primeList[k]-1))
        x+=1
        n*=primeList[k]
    return r

print(check(len(primeList)-1,1,1)-1)