欧拉系列
欧拉函数:phi(i)表示 1~i 中与 i 互质的数的个数。
利用这个定义就可以在筛素数的同时,求出欧拉函数。
设 欧拉函数 为 phi(x) , p 为素数:
1、如果 i % p == 0 ,那么 phi (i*p) = phi (i) * p。
显然,与 i 互质的每一个数都与 i*p 互质。
2、如果 i % p != 0 , 那么 phi (i*p) = phi (i) * (p-1) 。
因为 i 与 p 互质,根据积性函数的性质,得 phi(i*p) = phi(i) * phi(p)。
又因为 p 是质数,所以 phi(p) = p-1;
这样一来欧拉筛就成型了:
这里贴一道模板题: BZOJ 2190 仪仗队
代码:
1 #include<bits/stdc++.h> 2 #define N 40005 3 using namespace std; 4 int n; 5 int f[N],prime[N],tot,ans; 6 bool vis[N]; 7 inline void doingpre() 8 { 9 f[1]=1; 10 for (int i=2; i<=n; i++) 11 { 12 if (!vis[i]) 13 { 14 prime[++tot]=i; f[i]=i-1; 15 } 16 for (int j=1; j<=tot; j++) 17 { 18 if (i*prime[j]>N) break; 19 vis[i*prime[j]]=1; 20 if (i%prime[j]==0) 21 { 22 f[i*prime[j]]=f[i]*prime[j]; break; 23 } 24 else f[i*prime[j]]=f[i]*(prime[j]-1); 25 } 26 } 27 } 28 int main() 29 { 30 scanf("%d",&n); 31 doingpre(); 32 for (int i=1; i<n; i++) 33 ans+=f[i]; 34 printf("%d",2*ans+1); 35 return 0; 36 }
加油加油加油!!!fighting fighting fighting!!!