euler_prime

 1 /*
 2  算术基本定理
 3  n=p1^a1*p2^a2*p3^a3*...*pn^an
 4 
 5  约数个数:(p1+1)*(p2+1)*(p3+1)*..*(pn+1)
 6  phi(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)
 7 
 8  欧拉数:1-n中与n互质的数的个数
 9  phi(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)
10  若p为质数,则phi(n)=p-1
11  小于n且与n互质个数的和=euler[n]*n/2
12  (a,n)=1 ==>(n-a,n)=1
13 
14  n*n的点阵
15  ...
16  ...
17  ...
18  ans=2*(phi(1)+phi(2)+..+phi(n))
19 
20 */
21 void euler_prime(int n) {
22     euler[1] = 1;
23     for (int i = 2; i <= n; i++) {
24         if (!v[i]) {
25             prime[t++] = i;
26             euler[i] = i - 1;
27         }
28         for (int j = 0; j < t && prime[j] * i <= n; j++) {
29             v[prime[j] * i] = 1;
30             if (i % prime[j] == 0) {
31                 euler[i * prime[j]] = euler[i] * prime[j];
32                 break;
33             }
34             euler[i * prime[j]] = euler[i] * euler[prime[j]];
35         }
36     }
37 }
38 
39 void fenjie(n) {
40     euler(sqrt(n));
41     for (int i = 0; i < t; i++) {
42         if (n % prime[i] == 0) {
43             k++;
44             a[k] = prime[i];
45             while (n % prime[i] == 0) {
46                 b[k]++;
47                 n = n / prime[i];
48             }
49             if (n == 1) break;
50         }
51     }
52     if (n > 1) {
53         k++;
54         a[k] = n;
55         b[k] = 1;
56     }
57 }
58 
59 int yishugeshu() {
60     int res = 1;
61     for (int i = 1; i <= k; i++) {
62         res = res * (b[i] + 1);
63     }
64     return res;
65 }
原文地址:https://www.cnblogs.com/Accpted/p/11191839.html