C++ P3383 【模板】线性筛素数

题目:P3383 【模板】线性筛素数

哎,个人觉得看别人代码总是好的(我也是看书的),人外有人,天外有天嘛!

# include <iostream>
using namespace std;
int n, w, ans[1000010], tot, s; // 1…n 的数中 tot 个素数从小到大放在 ans 数组里(多清楚-_-||)
bool vis[100000010];
int main() {
	cin >> n >> w;
	for(int i = 2; i <= n; i++) {    // 线性筛选素数开始,一共七行,效率高,原理下面解释!
		if(vis[i] == false) ans[++tot] = i;
		for(int j = 1; (j <= tot) && (i*ans[j] <= n); j++) {
			vis[i * ans[j]] = true;
			if(i % ans[j] == 0) break;
		}
	}
	while(w--) {
		cin >> s;
		int i = 1, j = tot, mid;
		while(i <= j) {  // 别问我这是什么(二分查找喽)
			mid = (i + j) / 2;
			if(s == ans[mid]) { cout << "Yes" << endl; break; }
			else if(s < ans[mid]) j = mid - 1;
			else i = mid + 1;
		}
		if(s != ans[mid]) cout << "No" << endl;
	}
	return 0;
}
上面代码中,线性筛选素数的时间复杂度为 O(n), 你没看错。

筛选素数原理:合数可以由一个质数数与另一个数相乘得到 (高级一点的解释我就不会了尴尬

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值