题目:

代码:
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1000010;
int primes[N], cnt; //primes[]存每一个质数,cnt是质数的下标
int phi[N]; //phi[]记欧拉函数
bool st[N]; //st[]表示数被筛掉
LL get_eulers(int n)
{
phi[1]=1;
//线性筛法
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) //当前数没有被筛过,i是质数
{
primes[cnt ++ ] = i;
phi[i] = i - 1; //i是质数的话,有i-1个与它互质
}
for (int j = 0; primes[j] <= n / i; j ++ ) //枚举所有质数
{
int t = primes[j] * i;
st[t] = true;
if (i % primes[j] == 0)
{
phi[t] = phi[i] * primes[j];
break;
}
phi[t] = phi[i] * (primes[j] - 1);
}
}
LL res=0;
for(int i=1;i<=n;i++) res+=phi[i];
return res;
}
int main()
{
int n;
cin >> n;
cout <<get_eulers(n)<< endl;
return 0;
}