看输入输出就很简单。
事实上只要想通了,就没有什么问题
几乎是纯数学分析
我们考虑对称性,可以计算右下角的三角形的图形中的点数。
再纵向观察,查找规律,就可看出对于第i列,可以看见的点有euler(i-1)
所以累加就好了,然后乘2加一,就ok了
怎么分析,明年再说。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int prime[40005];
void getprime(){
memset(prime,0,sizeof(prime));
for(int i=2;i<=40000;i++){
if(prime[i]==0){
for(int j=i*2;j<=40000;j+=i){
prime[j]=1;
}
}
}
}
int euler(int m){
int ans=m;
for(int i=2;i<=m;i++){
if(m%i==0){
ans*=(i-1);
ans/=i;
while(m%i==0){
m/=i;
}
}
}
return ans;
}
int main(){
scanf("%d",&n);
if(n==1){
printf("0");
return 0;
}
int ans=0;
getprime();
for(int i=1;i<n;i++){
ans+=euler(i);
}
ans*=2;
ans++;
printf("%d",ans);
return 0;
}