筛法求莫比乌斯函数
唯一分解定理: 莫比乌斯函数定义: 例如: 筛法求莫比乌斯函数: 若i是质数,,在线性筛中,每个合数被最小质因子筛去,设是的最小质因子,则通过筛掉。
- 如果能被整除,则也包含质因子,此时
- 如果不能被整除,则比多一个不同的质因子,此时,原因如下:
- 如果,则
- 如果,则
- 如果,则
代码:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cout<<"a["<<x<<"]="<<a[x]<<endl;
#define pr(x) cout<<x<<endl;
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
int p[N], st[N], cnt;
int mu[N];
//筛法求莫比乌斯函数
void get(int n) {
mu[1]=1;
for(int i=2;i<=n;i++){
if (!st[i]){//质数
p[++cnt]=i;//加入到质数中去
mu[i]=-1;//第一次筛到肯定为-1
}
for(int j=1;i*p[j]<=n;j++){
st[i*p[j]]=true;
if (i%p[j]==0){
mu[i*p[j]]=0;//i*p[j]至少有两个质因子
break;
}else{
mu[i]=-mu[i];
}
}
}
}
int main() {
IOS;
#ifndef ONLINE_JUDGE
freopen("/Users/houyunfei/CLionProjects/MyCppWorkSpace/test.in", "r", stdin);
freopen("/Users/houyunfei/CLionProjects/MyCppWorkSpace/test.out", "w", stdout);
#endif
int n;
cin >> n;
get(n);
for (int i = 1; i <= n; i++)
pr(mu[i])
return 0;
}