对于线性筛的理解

线性筛

for(int i=2;i<=n;++i) {
	if(!vis[i]) pri[++cnt]=i;
	for(int j=1;j<=cnt&&i*pri[j]<=n;++j) {
		vis[i*pri[j]]=1;
		if(i%pri[j]==0) break;
	}
}

只会被最小的素数筛掉。
n = p 1 k 1 ∗ p 2 k 2 … … p x k x n=p_1^{k_1}*p_2^{k_2}……p_x^{k_x} n=p1k1p2k2pxkx
枚举的 i i i x p 1 \frac{x}{p_1} p1x,x就是被筛掉的值。
因为找到的素数都是从小到大的,所以从小到大枚举就好了。
i % p r i [ j ] = = 0 i\%pri[j]==0 i%pri[j]==0 就是说枚举到了 i i i的最小质因子。这之后的素数因为都比他大,所以都不合格,就break了。
之前的 p r i [ j ] pri[j] pri[j]都会比这个pri[j]小都是可以的,每个pri[j]都是i*pri[j]的最小质因子。
可以很方便的求积性函数,只需要毒瘤的简单的分类讨论就好了。
对于下方的东西,请移步cnblogs

求莫比乌斯函数

求欧拉函数

约数个数

约数和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值