版权声明:蒟蒻Blog随意转载 https://blog.csdn.net/a1799342217/article/details/81515606
欧拉函数
看出来后就变成套路题了。
能看到的点的横坐标和纵坐标肯定互质。那么转化一下就变成 。然后想上什么上什么。。。
把原式拆成 ,即 ,然后前缀和算一波就好了,答案要加1( 的情况,前面的 其实是算 和 两个点的)。注意特判 的情况。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 40005
using namespace std;
int n,phi[N];
inline int Make(){
for (int i=1;i<=n;i++) phi[i]=i;
for (int i=2;i<=n;i+=2) phi[i]>>=1;
for (int i=3;i<=n;i+=2)
if (phi[i]==i)
for (int j=i;j<=n;j+=i)
phi[j]=phi[j]/i*(i-1);
for (int i=2;i<=n;i++) phi[i]+=phi[i-1];
return n-1?phi[n-1]*2+1:0;
}
int main(){ return scanf("%d",&n),printf("%d\n",Make()),0; }