定义:
首先说一下定义吧,
φ
φ
φ (n) 表示从
n
n
n 与
x
x
x 互质的数的个数。其中
x
∈
[
1
,
n
]
x \in [1, n]
x∈[1,n]。
初始值: φ ( n ) = n φ (n) = n φ(n)=n
公式:
φ ( n ) = φ ( n ) ÷ x × ( x − 1 ) φ (n) = φ (n) \div x \times (x - 1) φ(n)=φ(n)÷x×(x−1),其中 x x x 满足是 n n n 的质因数。
代码实现
下面是用埃氏筛实现的欧拉函数,复杂度是 O ( n × log log n ) O(n \times \log \log n) O(n×loglogn),可以用线性筛优化到 O ( n ) O(n) O(n)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
bool st[N];
int phi[N];
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
phi[i] = i; // 初始化
}
for (int i = 2; i <= n; i++) {
if (phi[i] == i) { // 素数的情况
for (int j = i; j <= n; j += i) {
phi[j] = phi[j] * (i - 1) / i;
}
}
}
cout << phi[n] << "\n";
return 0;
}