作业介绍
模版
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 1e8 + 10; // 题目中n的最大值是1e8
vector<int> primes; // 存储所有素数
bool is_prime[MAXN]; // 标记是否为素数
void linear_sieve(int n) {
fill(is_prime, is_prime + n + 1, true); // 初始化为true
is_prime[0] = is_prime[1] = false; // 0和1不是素数
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
primes.push_back(i); // i是素数,加入素数表
}
// 用当前已得到的素数筛去合数
for (int j = 0; j < primes.size() && i * primes[j] <= n; ++j) {
is_prime[i * primes[j]] = false; // 标记为合数
// 关键优化:保证每个合数只被最小质因数筛除
if (i % primes[j] == 0) {
break;
}
}
}
}
int main() {
ios::sync_with_stdio(false); // 关闭同步,加速输入输出
cin.tie(nullptr); // 解除cin和cout的绑定
int n, q;
cin >> n >> q;
linear_sieve(n); // 预处理1-n的所有素数
while (q--) {
int k;
cin >> k;
cout << primes[k - 1] << "\n"; // 直接输出第k小的素数
}
return 0;
}
题目
- 状态
- 已结束
- 题目
- 1
- 开始时间
- 2025-6-22 0:00
- 截止时间
- 2025-6-30 23:59
- 可延期
- 24 小时