题目描述
作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 �×�N×N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。
输入格式
一行,一个正整数 �N。
输出格式
输出一行一个数,即 C 君应看到的学生人数。
输入输出样例
输入 #1复制
4
输出 #1复制
9
说明/提示
对于 100%100% 的数据,1≤�≤400001≤N≤40000。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int N,ans=0;
int phi[40005];
int flag[40005];
int prime[40005];
void soft(int n){
phi[1]=1;
int t=0;
for(int i=2;i<=n;i++){
if(!flag[i])prime[++t]=i,phi[i]=i-1;
for(int j=1;j<=t && i*prime[j]<=n;j++){
flag[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);
}
}
}
}
int main(){
cin>>N;
memset(flag,0,sizeof(flag));
memset(phi,0,sizeof(phi));
memset(prime,0,sizeof(prime));
soft(N);
for(int i=1;i<=N-1;i++){
ans+=phi[i];
}
if(N==1) cout<<0;
else cout<<ans*2+1;
}