1 欧拉函数模板
2
3 (1)直接求小于或等于n,且与n互质的个数:
4
5 int Euler(int n)
6
7 {
8
9 int ret=n;
10
11 for(int i=2;i<=sqrt(n);i++)
12
13 if(n%i==0)
14
15 {
16
17 ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
18
19 while(n%i==0)
20
21 n/=i;
22
23 }
24
25 if(n>1)
26
27 ret=ret/n*(n-1);
28
29 return ret;
30
31 }
32
33
34
35 筛选模板:求[1,n]之间每个数的质因数的个数
36
37 #define size 1000001
38
39 int euler[size];
40
41 void Init()
42
43 {
44
45 memset(euler,0,sizeof(euler));
46
47 euler[1]=1;
48
49 for(int i=2;i<size;i++)
50
51 if(!euler[i])
52
53 for(int j=i;j<size;j+=i)
54
55 {
56
57 if(!euler[j])
58
59 euler[j]=j;
60
61 euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
62
63 }
64
65 }