欧拉函数入门题...
当然如果有兴趣也可以用反演做...类似这题
题意就是求,方阵从左下角出发能看到多少个点。
从0开始给坐标
发现一个点能被看到,那么横纵坐标互质。
然后求欧拉函数的前缀和,* 2 + 1即可。
注意特判。
1 #include <cstdio> 2 const int N = 40010; 3 4 int p[N], phi[N], top; 5 bool vis[N]; 6 7 inline void getphi(int b) { 8 phi[1] = 1; 9 for(int i = 2; i <= b; i++) { 10 if(!vis[i]) { 11 p[++top] = i; 12 phi[i] = i - 1; 13 } 14 for(int j = 1; j <= top && i * p[j] <= b; j++) { 15 vis[i * p[j]] = 1; 16 if(i % p[j] == 0) { 17 phi[i * p[j]] = phi[i] * p[j]; 18 break; 19 } 20 phi[i * p[j]] = phi[i] * (p[j] - 1); 21 } 22 } 23 return; 24 } 25 26 int main() { 27 int n; 28 scanf("%d", &n); 29 if(n == 1) { 30 printf("0"); 31 return 0; 32 } 33 n--; 34 getphi(n); 35 int ans = 0; 36 for(int i = 1; i <= n; i++) { 37 ans += phi[i]; 38 } 39 ans = ans * 2 + 1; 40 printf("%d", ans); 41 42 return 0; 43 }