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 }