全是RE

P3383 【模板】线性筛素数

王仁之2013 @ 2024-08-15 09:45:31

#include <iostream>
#include <cstdio>
#include <cmath> 
using namespace std;
bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) return false;
    }
    return true;
}
int main() {
    int k,d;
    scanf("%d %d",&k,&d);
    int a[100000] = {0}; 
    int count = 0; 
    for (int i = 2; i <= k; i++) {
        if (isPrime(i)) {
            a[count++] = i; 
        }
    }
    for (int i = 0; i < d; i++) {
        int x;
        scanf("%d",&x);
        printf("%d\n",a[x-1]);
    }

    return 0;
}

by realheizi @ 2024-08-15 10:00:15

不建议把数组开在主函数内


by realheizi @ 2024-08-15 10:02:06

@王仁之2013 你的做法疑似会超时,这个题用欧拉筛


by realheizi @ 2024-08-15 10:04:13

n<=1e8,你这个O(n sqrt(n))的复杂度不行


by realheizi @ 2024-08-15 10:05:53

建议去网上找个欧拉筛的讲解


by realheizi @ 2024-08-15 10:08:13

欧拉筛关键代码:

for(int i=2;i<=n;i++){
    if(is_prime[i]){//如果i是质数 
        prime[len++]=i;//就应该存入表中 
    }
    for(int k=1;k<len&&prime[k]*i<=n;k++){//但是无论是不是质数,都要与已有质数相乘 
        is_prime[prime[k]*i]=false;//筛掉得到的数
        if(i%prime[k]==0) break; //如果当前质数已经是这个数的因数,退出循环 
        }
    }

|