洛谷 P2158 仪仗队

欧拉函数入门题...

当然如果有兴趣也可以用反演做...类似这题

题意就是求,方阵从左下角出发能看到多少个点。

从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 }
AC代码

莫比乌斯反演:

求n以内gcd == 1的数对个数。

根据上面的方法搞一搞,最后 + 2即可。

也要特判。

 1 #include <cstdio>
 2 
 3 const int N = 40010;
 4 
 5 int p[N], miu[N], top;
 6 bool vis[N];
 7 
 8 inline void getmiu(int b) {
 9     miu[1] = 1;
10     for(int i = 2; i <= b; i++) {
11         if(!vis[i]) {
12             p[++top] = i;
13             miu[i] = -1;
14         }
15         for(int j = 1; j <= top && i * p[j] <= b; j++) {
16             vis[i * p[j]] = 1;
17             if(i % p[j] == 0) {
18                 break;
19             }
20             miu[i * p[j]] = -miu[i];
21         }
22     }
23     return;
24 }
25 
26 int main() {
27     int n;
28     scanf("%d", &n);
29     n--;
30     if(!n) {
31         printf("0");
32         return 0;
33     }
34     getmiu(n);
35 
36     int ans = 0;
37     for(int i = 1; i <= n; i++) {
38         ans += miu[i] * (n / i) * (n / i);
39     }
40     printf("%d", ans + 2);
41     return 0;
42 }
AC代码

 

posted @ 2018-08-30 13:15  garage  阅读(77)  评论(0编辑  收藏  举报