CF870F
感觉完全没有 *2700
?
看到题,猜测
这种显然
这种可以设置一个中转点为
考虑怎样计数。发现对于一个
计算总数可以考虑对于每个质数
然后减去
思考发现这种的路径即为
需要线性筛预处理,没什么细节,具体可以参考代码。
code:
点击查看代码
int n,m,pm[N],c[N],f[N],g[N],phi[N],h[N],s[N];
bool vis[N];
void Yorushika(){
scanf("%d",&n);
ll sphi=0;
rep(i,2,n){
if(!vis[i]){
pm[++m]=i,c[m]++;
f[i]=i,g[i]=m,phi[i]=i-1;
}
rep(j,1,m){
if(i>n/pm[j])break;
int k=i*pm[j];
vis[k]=1,f[k]=pm[j];
c[g[pm[j]]]++;
if(i%pm[j]==0){phi[k]=phi[i]*pm[j];break;}
phi[k]=phi[i]*(pm[j]-1);
}
sphi+=i-1-phi[i];
}
int j=m;
pm[0]=1;
rep(i,1,m){
while(pm[i]>n/pm[j])j--;
h[i]=j,s[i]=s[i-1]+c[i];
}
ll sum=0,cnt=0;
rep(i,2,n){
sum+=s[h[g[f[i]]]];
sum-=f[i]<=n/f[i];
cnt+=f[i]<=n/2;
}
sum/=2,cnt=cnt*(cnt-1)/2;
printf("%lld\n",(sum-sphi)*2+sphi+(cnt-sum)*3);
}
signed main(){
int t=1;
// scanf("%d",&t);
while(t--)
Yorushika();
}