欧拉函数 欧拉筛 【数学】

欧拉系列

欧拉函数:及 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-1)。

又因为 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 }
View Code

加油加油加油!!!fighting fighting fighting!!!

猜你喜欢

转载自www.cnblogs.com/Frank-King/p/9498463.html