数论 | 欧拉函数
欧拉函数:对正整数
例如,
欧拉函数的值
一般方法
若
需要注意:
简单证明
若要获得
写成表达式即为:
但是可以发现,
最终表达式为:
通过化简即可得到结果式子的形式。
程序实现
该方法仅求得
- 时间复杂度:
- 空间复杂度:
编程时需要注意的是,
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin >> a;
int ans = a;
for (int i = 2; i <= a / i; i++)
{
if (!(a % i))
{
ans = ans / i * (i - 1);
while (!(a % i))
a /= i;
}
}
if (a > 1)
ans = ans / a * (a - 1);
cout << ans << endl;
return 0;
}
线性筛法
简单证明
通过简单改造线性筛,再筛得质数的同时计算出欧拉函数值。线性筛中有三种情况:
为质数 能被 整除 不能被 整除
我们分类讨论:
当
当
当
按照上面的转换方式修改线性筛的代码即可。
程序实现
该方法求得
- 时间复杂度:
- 空间复杂度:
const int MAXN = 1e6 + 10;
int prime[MAXN], phi[MAXN], idx;
bool is_prime[MAXN];
void init(int n)
{
memset(is_prime, 1, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (is_prime[i])
{
prime[idx++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < idx && i * prime[j] <= n; j++)
{
is_prime[i * prime[j]] = false;
if (!(i % prime[j]))
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi