φ \varphi φ
1. φ \varphi φ的定义
φ ( n ) \varphi(n) φ(n): 欧拉函数,费马小定理的扩展,求的是在[1, n]中,有多少个正整数和 n 互质
费马小定理只能用于质数,欧拉函数可以用于任何数(逆元)
2. 求 φ \varphi φ
暴力,利用 φ \varphi φ的性质
#include <algorithm>
#define gcd __gcd // 还没有学gcd怎么用,不准自己写
// 某些编译器可能不让用,就复制一下题解
#define int long long
int phi(int x)
{
int cnt = 0;
for(int i = 1; i <= x; i ++)
{
if(gcd(i, x) == 1) cnt ++;
}
return cnt;
}
太慢!时间复杂度 O ( N log N ) O(N\log N) O(NlogN)
怎么优化呢?
小茗优化
显然,在[1, N]中和N互质的正整数,就是和N没有相同的质因子的数
一个质因子就是质数,显然 φ ( N ) = N − 1 \varphi(N)=N-1 φ(N)=N−1
考虑两个质因子的情况,设质因子分别为p, q
那么 1 → N 1\to N 1→N中,p的倍数有 N p \frac{N}{p}