歐拉函數 歐拉篩 【數學】


歐拉系列

歐拉函數: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 }
View Code

 

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM