Pentium.Labs

System全家桶:https://zhuanlan.zhihu.com/c_1238468913098731520

导航

BZOJ2190 欧拉函数

题意: 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 }
View Code

 

posted on 2014-11-14 18:15  Pentium.Labs  阅读(375)  评论(0编辑  收藏  举报



Pentium.Lab Since 1998