欧拉计划 Project Euler 69(欧拉总计函数与最大值)题解
欧拉计划 Project Euler 69 题解
- 题干
- 欧拉总计函数与最大值
- 思路
- code
题干
欧拉总计函数与最大值
小于 n n n且与 n n n互质的正整数的数量记为欧拉总计函数 φ ( n ) \varphi(n) φ(n),例如, 1 、 2 、 4 、 5 、 7 1、2、4、5、7 1、2、4、5、7和 8 8 8均小于 9 9 9且与 9 9 9互质,因此 φ ( 9 ) = 6 \varphi(9)=6 φ(9)=6
n | Relatively Prime | phi(n) | n/phi(n) |
2 | 1 | 1 | 2 |
3 | 1,2 | 2 | 1.5 |
4 | 1,3 | 2 | 2 |
5 | 1,2,3,4 | 4 | 1.25 |
6 | 1,5 | 2 | 3 |
7 | 1,2,3,4,5,6 | 6 | 1.1666... |
8 | 1,3,5,7 | 4 | 2 |
9 | 1,2,4,5,7,8 | 6 | 1.5 |
10 | 1,3,7,9 | 4 | 2.5 |
可以看出,对于 n ≤ 10 n\leq10 n≤10,当 n = 6 n=6 n=6时 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n取得最大值。
对于 n ≤ 1000000 n\leq1000000 n≤1000000,求使得 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n取得最大值的 n n n。
思路
为了找到在 n ≤ 1000000 n\leq1000000 n≤1000000范围内使得 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n取得最大值的 n n n,我们需要理解欧拉函数的性质以及表达式 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n。
欧拉函数 φ ( n ) \varphi(n) φ(n)计算的是小于或等于 n n n且与n互质的正整数的个数。
φ ( n ) \varphi(n) φ(n)的计算公式与 n n n的素因数分解相关。如果 n = p 1 k 1 p 2 k 2 … p r k r n = p_{1}^{k_{1}}p_{2}^{k_{2}}\dots p_{r}^{k_{r}} n=p1k1p2k2…prkr是 n n n的素因数分解,那么:
φ ( n ) = n ∏ p ∣ n ( 1 − 1 p ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) … ( 1 − 1 p r ) \varphi(n) = n\prod_{p|n}(1-\frac{1}{p}) = n(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})\dots (1-\frac{1}{p_{r}}) φ(n)=np∣n∏(1−p1)=n(1−p11)(1−p21)…(1−pr1)
因此 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n可以改写为
n φ ( n ) = n n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) … ( 1 − 1 p r ) = 1 ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) … ( 1 − 1 p r ) \frac{n}{\varphi(n)} = \frac{n}{n(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})\dots (1-\frac{1}{p_{r}})} = \frac{1}{(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})\dots(1-\frac{1}{p_{r}})} φ(n)n=n(1−p11)(1−p21)…(1−pr1)n=(1−p11)(1−p21)…(1−pr1)1
进一步化简为
n φ ( n ) = ( p 1 p 1 − 1 ) ( p 2 p 2 − 1 ) … ( p r p r − 1 ) \frac{n}{\varphi(n)} = (\frac{p_{1}}{p_{1} -1})(\frac{p_{2}}{p_{2}-1})\dots(\frac{p_{r}}{p_{r}-1}) φ(n)n=(p1−1p1)(p2−1p2)…(pr−1pr)
要使 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n最大化,我们需要让这个乘积最大化,注意到每一项 p p − 1 \frac{p}{p-1} p−1p都大于 1 1 1,为了使这个乘积尽可能的大,我们应该选择:
- 尽可能多的不同的素因子。
- 尽可能小的素因子,因为对于较小的素数 p p p, p p − 1 \frac{p}{p-1} p−1p的值较大。
因此,我们应该选择 n n n为最小的若干连续素数的乘积,并且这个乘积不超过 1000000 1000000 1000000这种数被称为素连乘数(primorial)。
让我们来计算一下这些素连乘数
- 2 2 2
- 2 × 3 = 6 2\times3=6 2×3=6
- 2 × 3 × 5 = 30 2 \times 3 \times 5 = 30 2×3×5=30
- 2 × 3 × 5 × 7 = 210 2 \times 3 \times 5 \times 7 = 210 2×3×5×7=210
- 2 × 3 × 5 × 7 × 11 = 2310 2 \times 3 \times 5 \times 7 \times 11 = 2310 2×3×5×7×11=2310
- 2 × 3 × 5 × 7 × 11 × 13 = 30030 2 \times 3 \times 5 \times 7 \times 11 \times 13 =30030 2×3×5×7×11×13=30030
- 2 × 3 × 5 × 7 × 11 × 13 × 17 = 510510 2 \times 3 \times 5 \times 7 \times 11 \times 13 \times17=510510 2×3×5×7×11×13×17=510510
- 2 × 3 × 5 × 7 × 11 × 13 × 17 × 19 = 9699690 2 \times 3 \times 5 \times 7 \times 11 \times 13\times17\times19=9699690 2×3×5×7×11×13×17×19=9699690
由于 9699690 ≥ 1000000 9699690\geq1000000 9699690≥1000000所以我们能取到的最大的数是 510510 510510 510510。
这个数 n = 510510 n=510510 n=510510是由最小的连续素数 2 , 3 , 5 , 7 , 11 , 13 , 17 2,3,5,7,11,13,17 2,3,5,7,11,13,17的乘积得到的。任何其它小于等于 1000000 1000000 1000000的数,如果包含更大的素因数或者素因数的幂次(这不会改变 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n的值,因为 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n只依赖于不同的素因数),或者包含的因数更少,其 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n的值都会更小。
因此,对于 n ≤ 1000000 n\leq1000000 n≤1000000,使得 n φ ( n ) \frac{n}{\varphi(n)} φ(n)n取得最大值的n是 510510 510510 510510。
code
其实根据上诉的思路不需要code了,但是还是给一下把
可以用筛法先筛选一些素数,当然也可以直接打表
// 510510
#include <bits/stdc++.h>using namespace std;using ll = long long;void solve() {ll li = 1000000;vector<int> pri = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};ll n = 1, cur = 1;for (int p : pri) {if (p == 0) continue;if (cur > li / p) {break;}cur *= p;n = cur;}cout << n << "\n";}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int tt = 1; // cin >> tt;while (tt--) {solve();}return 0;
}