點擊這裏查看原題
顯然,對於每個(x,y)(x,y均不爲1),(x,y)能被看到的條件是gcd(x-1,y-1)=1,因此我們需要求gcd(x-1,y-1)=1的對數,由於第一排、第一列分別有一個可以看到的,因此答案還需要加2。
對每一排,x<=y中,滿足條件的x的個數等於phi(y);對每一列同理(但是(2,2)被算了兩次),因此答案=2*sigma(phi(i))-1+2(1<=i<=n)
/*
User:Small
Language:C++
Problem No.:2705
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=4e5+5;
int phi[M],prime[M],cnt,n,ans;
bool not_prime[M];
int main(){
freopen("data.in","r",stdin);//
scanf("%d",&n);
phi[1]=1;
for(int i=2;i<=n;i++){
if(!not_prime[i]){
prime[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
not_prime[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=1;i<n;i++) ans+=phi[i];
printf("%d\n",2*ans+1);
return 0;
}