http://www.lydsy.com/JudgeOnline/problem.php?id=2190
应该说是数论中档题吧
可以这样思考
我们首先只看一半的
因为这个东西是对称的
那么离原点横坐标为x的距离的这一列上可以看到的点是phi(x)
其中phi是欧拉函数
因为如果他们两个互质的话
前边不会有点会挡住他
这一点很好理解
那么我们算每个数的欧拉函数然后再加和就好了
当然是用线性欧拉函数的筛法
最后求和
在×2+3
3是第一个点的3
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=40000;
int A[N];
int main(){
for(int i=2;i<=N;++i) A[i]=i;
for(int i=2;i<=N;++i){
if(A[i]==i){
for(int j=i;j<=N;j+=i)
A[j]=A[j]/i*(i-1);
}
}
int x;
cin>>x;
int ans=0;
for(int i=1;i<x;++i){
ans+=A[i];
}
cout<<ans*2+3<<endl;
}