素数筛

#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define maxn 1005 #define maxm 1005 bool is[maxn]; int prm[maxm]; int n, m; int sum[maxn]; int getprm(int n) { int i, j, k = 0; int s, e = (int) (sqrt(0.0 + n) + 1); memset(is, 1, sizeof(is)); prm[k++] = 1; prm[k++] = 2; is[0] = 0; for (i = 4; i < n; i += 2) is[i] = 0; for (i = 3; i < e; i += 2) if (is[i]) { prm[k++] = i; for (s = i * 2, j = i * i; j < n; j += s) is[j] = 0; } for (; i < n; i += 2) if (is[i]) prm[k++] = i; return k; } void work(int n, int m) { int a, b; if (n & 1) { m--; a = n / 2 - m; b = n / 2 + m; }else { a = n / 2 - m; b = n / 2 + m - 1; } if (a < 0) a = 0; if (b >= n) b = n - 1; for (int i = a; i <= b; i++) printf(" %d", prm[i]); puts("\n"); } int main() { // freopen("t.txt", "r", stdin); getprm(1001); memset(sum, 0, sizeof(sum)); for (int i = 1; i <= 1000; i++) if (is[i]) sum[i] = sum[i - 1] + 1; else sum[i] = sum[i - 1]; while (scanf("%d%d", &n, &m) != EOF) { printf("%d %d:", n, m); work(sum[n], m); } return 0; }