连续解了3天,终于AC了,创造奇迹
2025-08-07 15:06:27
发布于:广东
9阅读
0回复
0点赞
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAX_N 100000000
bool* sieve;
int* primes;
int prime_count = 0;
void euler_sieve(int n) {
sieve = (bool*)malloc((n + 1) * sizeof(bool));
primes = (int*)malloc((n + 1) * sizeof(int));
memset(sieve, true, (n + 1) * sizeof(bool));
sieve[0] = sieve[1] = false;
for (int i = 2; i <= n; i++) {
if (sieve[i]) {
primes[++prime_count] = i;
}
for (int j = 1; j <= prime_count && i * primes[j] <= n; j++) {
sieve[i * primes[j]] = false;
if (i % primes[j] == 0) {
break;
}
}
}
}
int main() {
int n, q;
scanf("%d %d", &n, &q);
if (n > MAX_N) n = MAX_N;
euler_sieve(n);
while (q--) {
int k;
scanf("%d", &k);
if (k <= prime_count) {
printf("%d\n", primes[k]);
} else {
printf("0\n");
}
}
free(sieve);
free(primes);
return 0;
}
记得点赞!
你们的点赞是我最大的动力!
全部评论 2
不对啊,当时我没学过线筛,这个数据范围确实只有线筛能过,不过我记得我样例3数据有问题啊
5天前 来自 上海
0真的解了3天
2025-08-07 来自 广东
0
有帮助,赞一个