Uva10820 欧拉公式模板(求小于n且与n互素的数的个数)

时间:2022-04-02 19:10:13

题意:

给出n,算出小于等于n的所有数中,有几对互质;

解法:

本质就是求有多少个2元组(x,y)满足:1 <= x,y <= n,且x与y互素。

除了(1,1)之外,其他所有的x和y都不相同,我们设x<y的二元组有f(n)个,答案就是2f(n)+1 f(n)=phi(2)+phi(3)+...+phi(n);

 1 #include<cstdio>
 2 #include<cmath>
 3 using namespace std;
 4 const int maxn = 5e4 + 5;
 5 int phi[maxn];
 6 
 7 //欧拉函数,求小于n且与n互素的整数个数
 8 int euler_phi(int n) {
 9     int m = (int)sqrt(n + 0.5);
10     int ans = n;
11     for (int i = 2; i <= m; i++) if (n%i == 0) {
12         ans = ans / i*(i - 1);
13         while (n%i == 0)n /= i;
14     }
15     if (n > 1)ans = ans / n*(n - 1);
16     return ans;
17 }
18 
19 //求小于n的所有数的欧拉函数值
20 void phi_table(int n, int *phi) {
21     for (int i = 2; i <= n; i++)phi[i] = 0;
22     phi[1] = 1;
23     for (int i = 2; i <= n; i++)if (!phi[i])
24         for (int j = i; j <= n; j += i) {
25             if (!phi[j])phi[j] = j;
26             phi[j] = phi[j] / i*(i - 1);
27         }
28 }
29 
30 int main() {
31     int n;
32     while (scanf("%d", &n) && n) {
33         phi_table(n, phi);
34         int ans = 0;
35         for (int i = 2; i <= n; i++) ans += phi[i];
36         printf("%d\n", ans + ans + 1);
37     }
38     return 0;
39 }