1. 程式人生 > >歐拉線性篩

歐拉線性篩

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]<<" ";
}

歐拉線性篩