poj 3292 筛4n+1素数

来源:互联网 发布:java 弱引用 使用场景 编辑:程序博客网 时间:2024/05/18 02:19

题意:

给一个数h,求1-h之间的 4*n + 1 的素合数有多少。

素合数的定义是 两个 4*n+1的素数之间的积。


代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <climits>#include <cassert>#define LL long long#define lson lo, mi, rt << 1#define rson mi + 1, hi, rt << 1 | 1using namespace std;const int maxn = 1000001 + 10;const int inf = 0x3f3f3f3f;const double eps = 1e-8;const double pi = acos(-1.0);const double ee = exp(1.0);int cnt[maxn];int hNum[maxn];void primeTable(){    memset(hNum, 0, sizeof(hNum));//0 is h prime    for (int i = 5; i <= maxn; i += 4)    {        for (int j = 5; j <= maxn; j += 4)        {            int mul = i * j;            if (maxn < mul)                break;            if (!hNum[i] && !hNum[j])                hNum[mul] = 1;//1 is h semi prime            else                hNum[mul] = -1;//-1 is h composite        }    }    int c = 0;    for (int i = 1; i < maxn; i++)    {        if (hNum[i] == 1)            c++;        cnt[i] = c;    }}int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);#endif // LOCAL    primeTable();    int h;    while (~scanf("%d", &h) && h)    {        printf("%d %d\n", h, cnt[h]);    }    return 0;}


0 0
原创粉丝点击