代码改变世界

POJ_3090.Visible Lattice Points

2011-05-22 09:41  Min·zc  阅读(154)  评论(0编辑  收藏  举报
 1 /*
 2  *
 3  *因为是关于对角线对称,所以只需要求解矩形的下半部分在乘以2就可以了
 4  *满足题意的点对的要求是x和y互质,可以使用欧拉函数
 5  *需要注意的是特殊的点对(1,1)(0,1)(1,0)
 6  *这三个需要单独拿出来计算
 7  */
 8 #include <iostream>
 9 using namespace std;
10 long long ans[1010];
11 long long eular(int n)
12 {
13         long long ret=1;
14         for(int i=2;i*i<=n;i++)
15         {
16                 if(n%i==0)
17                 {
18                         ret*=(i-1);
19                         n/=i;
20                         while(n%i==0)
21                         {
22                                 n/=i;
23                                 ret*=i;
24                         }
25                 }
26         }
27         if(n>1)
28                 ret*=n-1;
29         return ret;
30 }
31 void set()
32 {
33         for(int i=2;i<1002;i++)
34                 ans[i]=eular(i);
35 }
36 int main()
37 {
38         int t;
39         cin>>t;
40         set();
41         for(int j=1;j<=t;j++)
42         {
43                 int aim;
44                 long long sum=0;
45                 cin>>aim;
46         
47                 for(int i=2;i<=aim;i++)
48                         sum+=ans[i];
49                 cout<<j<<" "<<aim<<" "<<sum*2+3<<endl;
50         }
51 }