線性篩-歐拉-莫比烏斯

線性篩

//歐拉函數 
#include<iostream>
#include<cstdio>
using namespace std;
int n,vis[105],prim[105],t;
int main()
{
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            prim[++t]=i;//prim[1]   
        }
        for(int j=1;j<=t && i*prim[j]<=n;j++)
        {   
            vis[i*prim[j]]=1;//打標記表示不是質數 4%2==0 4*2=8
            if(i%prim[j]==0 )break;
        }
    }
    for(int i=1;i<=t;i++)
        cout<<prim[i]<<" ";
}
//歐拉函數 
#include<iostream>
#include<cstdio>
using namespace std;
int n,vis[105],prim[105],t,PHI[105];
int main()
{
    cin>>n;
    PHI[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            prim[++t]=i;//prim[1]   
            PHI[i]=i-1;
        }
        for(int j=1;j<=t && i*prim[j]<=n;j++)
        {   
            vis[i*prim[j]]=1;//打標記表示不是質數 4%2==0 4*2=8
            if(i%prim[j]==0 )
            {
                PHI[i*prim[j]]=prim[j]*PHI[i];
            }
            else
                PHI[i*prim[j]]=PHI[i]*(prim[j]-1);
        }
    }
    for(int i=1;i<=n;i++)
        cout<<PHI[i]<<" ";
}
//莫比烏斯函數
#include<iostream>
#include<cstdio>
using namespace std;
int n,vis[105],prim[105],t,mu[105];
int main()
{
    cin>>n;
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            prim[++t]=i;//prim[1]   
            mu[i]=-1;
        }
        for(int j=1;j<=t && i*prim[j]<=n;j++)
        {   
            vis[i*prim[j]]=1;//打標記表示不是質數 4%2==0 4*2=8
            if(i%prim[j]==0 )
            {
                mu[i*prim[j]]=0;
            }
            else
            {
                mu[i*prim[j]]=mu[i]*(-1);
            }
        }
    }
    for(int i=1;i<=n;i++)
        cout<<mu[i]<<" ";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章