欧拉函数
观察一下式子即可发现, F(n) 的个数即为 φ(n) 。而题目要我们求 ∑ni=1F(n) ,即相当于求 ∑ni=1φ(n) 。利用递推式先算出 φ(1)−−φ(n) ,再前缀和处理即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1000000
using namespace std;
typedef long long LL;
LL n,phi[MAXN+5];//注意答案是会爆int的
void Make(){//递推及前缀和
for (int i=1;i<=MAXN;i++) phi[i]=i;
for (int i=2;i<=MAXN;i+=2) phi[i]/=2;
for (int i=3;i<=MAXN;i+=2)//递推
if (phi[i]==i)
for (int j=i;j<=MAXN;j+=i)
phi[j]=phi[j]/i*(i-1);
for (int i=3;i<=MAXN;i++) phi[i]+=phi[i-1];//前缀和
}
int main(){
Make();
while (scanf("%lld",&n)&&n)
printf("%lld\n",phi[n]);
return 0;
}