定义:
对于一个整数n,
f
(
n
)
=
所
有
不
大
于
n
且
与
n
互
质
的
整
数
的
个
数
f(n) = 所有不大于n且与n互质的整数的个数
f(n)=所有不大于n且与n互质的整数的个数
举例:
f
(
12
)
=
4
f(12) = 4
f(12)=4 其中分别为:1 5 7 11。
求法:
对于一个整数N有, N = P 1 k 1 ∗ P 2 k 2 . . . . ∗ P a k a N = P_1^{k_1}*P_2^{k_2}....*P_a^{k_a} N=P1k1∗P2k2....∗Paka则欧拉函数 f ( N ) = N ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p a ) ) f(N) = N(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})...(1 - \frac{1}{p_a})) f(N)=N(1−p11)(1−p21)...(1−pa1))
公式求法:
分解质因数+套公式
题目
#include<bits/stdc++.h>
#define ll long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define pb push_back
#define endl '\n'
#define IO ios::sync_with_stdio(false)
using namespace std;
const ll maxn = 1e6 + 5;
ll n,num[maxn],cp[maxn],sum;
int main(){
cin >> n;
while(n--){
ll t;
cin >> t;
ll res = t;
for(ll i = 2; i * i <= t; i++){
if(t % i == 0){
res = res * (i - 1) / i;
while(t % i == 0)
t /= i;
}
}
if(t != 1)
res = res * (t - 1) / t;
cout << res << endl;
}
return 0;
}
质数筛法:
题目
当i为质数时
f
(
i
)
=
i
−
1
f(i) = i - 1
f(i)=i−1
当i能被prime[j]整除时,说明prime[j]为i的一个质因子因此
f
(
p
r
i
m
e
[
j
]
∗
i
)
f(prime[j] * i)
f(prime[j]∗i)比
f
(
i
)
f(i)
f(i)只多了一个
p
r
i
m
e
[
j
]
prime[j]
prime[j]
当不被整数时除了多
p
r
i
m
e
[
j
]
prime[j]
prime[j],还多一个
(
1
−
1
p
r
i
m
e
[
j
]
)
(1 - \frac{1}{prime[j]})
(1−prime[j]1)整理得多出一个
p
r
i
m
e
[
j
]
−
1
prime[j] - 1
prime[j]−1
#include<bits/stdc++.h>
#define ll long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define pb push_back
#define endl '\n'
#define IO ios::sync_with_stdio(false)
using namespace std;
const ll maxn = 1e6 + 5;
int prime[maxn],cnt,n;
int bk[maxn],phi[maxn];
void euler(){
for(int i = 2; i <= n; i++){
if(!bk[i])phi[i] = i - 1,prime[++cnt] = i;
for(int j = 1; prime[j] <= n / i; j++){
bk[prime[j] * i] = 1;
if(i % prime[j] == 0){
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
int main(){
IO;
cin >> n;
euler();
ll ans = 0;
for(int i = 1; i <= n; i++)
ans += phi[i];
cout << ans << endl;
return 0;
}