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 }
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 }