AcWing 201. 可见的点

原题链接

考察:欧拉函数+递推

数论的每一道题都是看书上的提示才做出来...orz

正确思路:

       通过观察发现(要看题目给的图,自己画的图观察不出答案....),当gcd(x,y)==1时.这个点就可见.所以当x与y互质答案就++.考虑到互质可以想到欧拉函数.这道题大正方形的答案可以由小正方形推导出来.注意当n==1时答案有3个.想出这些就简单了

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 1010;
 4 typedef long long ll;
 5 int phi[N],cnt,prime[N];
 6 bool st[N];
 7 ll ans[N];
 8 void Get_eulers(int n)
 9 {
10     phi[1] = 1;
11     for(int i=2;i<=n;i++)
12     {
13         if(!st[i]) prime[cnt++] = i,phi[i] = i-1;
14         for(int j=0;prime[j]<=n/i;j++)
15         {
16             st[prime[j]*i] = 1;
17             if(i%prime[j]==0)
18             {
19                 phi[prime[j]*i] = prime[j]*phi[i];
20                 break;
21             }
22             phi[prime[j]*i] = (prime[j]-1)*phi[i];
23         }
24     }
25 }
26 int main()
27 {
28     int T,kcase = 0;
29     scanf("%d",&T);
30     Get_eulers(1000);
31     ans[1] = 3;
32     for(int i=2;i<=1000;i++)
33         ans[i] = ans[i-1]+(ll)phi[i]*2;
34     while(T--)
35     {
36         int x;
37         scanf("%d",&x);
38         printf("%d %d %d\n",++kcase,x,ans[x]);
39     }
40     return 0;
41 }

 

posted @ 2021-01-17 02:45  acmloser  阅读(89)  评论(0编辑  收藏  举报