歐拉線性篩
阿新 • • 發佈:2019-05-09
memset sin cstring class color mem int 線性 spa
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int prime[100001],mark[1000001];//prime是素數數組,mark為標記不是素數的數組 int tot,phi[100001];//phi為φ(),tot為1~i現求出的素數個數 void getphi(int N){ phi[1]=1;//φ(1)=1 for(int i=2;i<=N;i++){//從2枚舉到N if(!mark[i]){//如果是素數prime[++tot]=i;//那麽進素數數組,指針加1 phi[i]=i-1;//根據性質1所得 } for(int j=1;j<=tot;j++){//從現求出素數枚舉 if(i*prime[j]>N) break;//如果超出了所求範圍就沒有意義了 mark[i*prime[j]]=1;//標記i*prime[j]不是素數 if(i%prime[j]==0){//應用性質2 phi[i*prime[j]]=phi[i]*prime[j];break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]];//應用性質3 } } } int N; int main(){ cin>>N; getphi(N); for(int i=1;i<=N;i++){ cout<<i<<":phi ( "<<phi[i]<<" )"<<endl;//輸出phi(i) } } /* ①:φ(p)=p-1 ②:φ(p*i)=p*φ(i) (當p%i==0時) ③:φ(p*i)=(p-1)*φ(i) (當p%i!=0時)*/
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int prime[100001],mark[1000001];//prime是素數數組,mark為標記不是素數的數組 int tot,phi[100001];//phi為φ(),tot為1~i現求出的素數個數 void getphi(int N){ phi[1]=1;//φ(1)=1 for(int i=2;i<=N;i++){//從2枚舉到N if(!mark[i]){//如果是素數 prime[++tot]=i;//那麽進素數數組,指針加1 phi[i]=i-1;//根據性質1所得 } for(int j=1;j<=tot;j++){//從現求出素數枚舉 if(i*prime[j]>N) break;//如果超出了所求範圍就沒有意義了 mark[i*prime[j]]=1;//標記i*prime[j]不是素數 if(i%prime[j]==0){//應用性質2 phi[i*prime[j]]=phi[i]*prime[j];break; } else phi[i*prime[j]]=phi[i]*phi[prime[j]];//應用性質3 } } } int N; int main(){ cin>>N; getphi(N); for(int i=1;i<=N;i++){ cout<<i<<":phi ( "<<phi[i]<<" )"<<endl;//輸出phi(i) } }
#include<iostream> #include<cstring> using namespace std; long long phi[10000]; long long getphi() { memset(phi,0,sizeof(phi)); phi[1]=0; for(int i=2;i<=1000;i++) { if(!phi[i]) for(int j=i;j<=1000;j=j+i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } int main() { getphi(); for(int i=1;i<=1000;i++) cout<<phi[i]<<" "; }
歐拉線性篩