poj1595

素数筛

View Code
#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;

}

 

你可能感兴趣的:(poj)