作业介绍

模版

#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 小时