题目大意
给出n≤10^6,求出前n个欧拉函数之和
解题思路
无脑线性筛。线性筛欧拉函数可查看http://blog.youkuaiyun.com/ji414341055/article/details/5771066,配wikipedia使用效果更佳。
自己以后注意一下线性筛时n的大小。
Code
#include <iostream>
using namespace std;
int totalprime;
int v[1000001], prime[100000], phi[1000001];
long long sum[1000001];
void getprime(int n)
{
for (int i = 2; i < n; i++)
{
if (!v[i])
{
prime[totalprime++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < totalprime && i * prime[j] < n; j++)
{
v[i * prime[j]] = 1;
if (i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
for (int i = 2; i <= n; i++) sum[i] = sum[i - 1] + phi[i];
}
int main()
{
ios::sync_with_stdio(false);
getprime(1000001);
int n;
while (cin >> n)
{
if (!n) break;
cout << sum[n] << endl;
}
}