欧拉函数模板

 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 }

 

posted @ 2018-10-29 21:50  huluxin  阅读(142)  评论(0编辑  收藏  举报