题意: http://www.lydsy.com/JudgeOnline/problem.php?id=2190
这个矩阵是对称的,因此只要算出上三角的一半就行了
一开始不太好看,不妨让坐标从0开始:
eg:对于N=6的情况,令起始点坐标为(0,0)。
那么所有能看见的点就是:
1,1 1,2 1,3 1,4 1,5 2,3 2,5 3,4 3,5 4,5 0,1
容易发现除了带0的那个点之外,其他的点都满足gcd(x,y)=1
这样问题就简单了,比bzoj2186那个题简单多了。直接累加欧拉函数就行,
注意:1,1对角线上那个点算了两次,最后答案-1
带0的点没记进去,最后答案+2
所以ans=2*sum(phi[1..n-1])+2-1
1 #include "iostream" 2 using namespace std; 3 #define LL long long 4 #define MMX 50010 5 int phi[MMX],psum[MMX]; 6 LL n,ans; 7 8 void calc_phi(int n) //求1--n的欧拉函数,phi[i]=φ(i) 9 { 10 for (int i=2;i<=n;i++) 11 phi[i]=0; 12 phi[1]=1; 13 for (int i=2;i<=n;i++) 14 if (!phi[i]) 15 for (int j=i;j<=n;j+=i) 16 { 17 if (!phi[j]) phi[j]=j; 18 phi[j]=phi[j]/i*(i-1); 19 } 20 psum[1]=1; 21 for (int i=2;i<=n;i++) 22 psum[i]=psum[i-1]+phi[i]; 23 } 24 25 int main() 26 { 27 while (cin>>n) 28 { 29 calc_phi(n); 30 ans=2*psum[n-1]+1; 31 cout<<ans<<endl; 32 } 33 }