求单个的欧拉函数
用最简单的求质数的方法来求某个数的欧拉函数
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
int n;
cin >> n;
while(n--)
{
LL x;
cin >> x;
LL res = x;
for(LL i = 2; i <= x / i; ++ i)
{//欧拉函数的时间复杂度取决于因式分解的时间复杂度
//所以因式分解的时间复杂度是O(n * sqrt(ai))
//欧拉函数的时间复杂度是O(n * sqrt(ai))
if(x % i == 0)
{
while(x % i == 0)
{
x /= i;
}
res = res / i * (i - 1);
}
}
if(x > 1)
res = res / x * (x - 1);
cout << res << endl;
}
return 0;
}
线性筛求欧拉函数(求从1到n的每一个数的欧拉函数)
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int primes[N], cnt;
int euler[N];
bool st[N];
void get_euler(int n)
{
euler[1] = 1;
for(int i = 2; i <= n; ++i)
{
if(!st[i])
{
primes[cnt++] = i;
euler[i] = i - 1;
}
for(int j = 0; primes[j] <= n / i; ++j)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0)
{
euler[primes[j] * i] = euler[i] * primes[j];
break;
}
euler[primes[j] * i] = euler[i] * (primes[j] - 1);
}
}
}
int main()
{
int n;
cin >> n;
get_euler(n);
LL res = 0;
for(int i = 1; i <= n; ++i)
res += euler[i];
cout << res << endl;
return 0;
}