题目地址
题目大意
求2到n的欧拉函数值的和。
解题思路
套模板,先打表,不然会超时
AC代码
#include <iostream>
using namespace std;
int prime[1000005];
int phi[1000005];
int vis[1000005];
int ans = 0;
void Euler(int n)
{
phi[1] = 1;
for (int i=2; i<=n; i++)
{
if (!vis[i])
{
prime[ans++] = i;
phi[i] = i-1;
}
for (int j=0; j<ans && i*prime[j] <= n; j++)
{
vis[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);
}
}
}
}
long long Sum(int n)
{
long long sum = 0;
for (int i=2; i<=n; i++)
{
sum+=phi[i];
}
return sum;
}
int main()
{
Euler(1000004);
int n;
while (cin >> n && n != 0)
{
cout << Sum(n) << endl;
}
return 0;
}