欧拉函数模板
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 }