Project Euler 248

Project Euler 248

题目

Numbers for which Euler’s totient function equals $13!$

The first number n for which $\varphi(n)=13!$ is $6227180929$.

Find the $150,000^{\text{th}}$ such number.

解决方案

令$M=13!$。如果$\varphi(n)=M$,那么$n$的所有质因数$p$的欧拉函数$\varphi(p)=p-1$,都有$p-1|M$。

那么,先求出$M$的所有因数$d$,再将所有是质数的$d+1$存入数组$pr$中。

最终,$n$一定是由数组$pr$的一些质因子相乘而得。

考虑通过深度优先搜索,枚举出所有$\varphi(n)=M$的$n$值。从大到小枚举所有质因数并逐一尝试,这样做可以有效减少枚举量。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from tools import fac, is_prime, divisors

N = 13
Q = 150000
M = fac(N)
pr = [x + 1 for x in divisors(M) if is_prime(x + 1)][::-1]
ls = []


def dfs(f, n, rest):
if rest == 1:
ls.append(n)
for i in range(f, len(pr)):
p = pr[i]
if rest % (p - 1) == 0:
dfs(i + 1, n * p, rest // (p - 1))
t_n, t_rest = n * p, rest // (p - 1)
while t_rest % p == 0:
t_rest //= p
t_n *= p
dfs(i + 1, t_n, t_rest)


dfs(0, 1, M)
ls.sort()
ans = ls[Q - 1]
print(ans)
# 16s~17s

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
Ujimatsu Chiya 微信 微信
Ujimatsu Chiya 支付宝 支付宝