莫比乌斯反演

https://blog.csdn.net/tomandjake_/article/details/81083703

上面这篇文章讲得很好

下面我对模板做一些分析

int mu[maxn], vis[maxn];
int primes[maxn], cnt;
void get_mu() {
	memset(vis, 0, sizeof(vis));
	memset(mu, 0, sizeof(mu));
	cnt = 0; mu[1] = 1;
	for (int i = 2; i <= maxn; ++i) {
		if (!vis[i]) { primes[cnt++] = i; mu[i] = -1; }
		for (int j = 0; j<cnt&&primes[j] * i <= maxn; ++j) {
			vis[primes[j] * i] = 1;
			if (i%primes[j] == 0)break;
			mu[i*primes[j]] = -mu[i];
		}
	}
}

mu[]就是莫比乌斯函数μ

去掉关于mu的部分就是欧拉筛了

素数的质因子只有他自己,所以mu[]=-1

合数的话,不会在质数那一关被赋初值,只能在筛选素数的时候赋初值,而由于最后一句话在if下面,因此像4这样的高阶合数是不会被赋值的,也就是0.被赋值的都是一阶合数(阶数是质因子的最高阶数)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值