zoukankan      html  css  js  c++  java
  • poj3511

    如果一个质数可以表示成4x+1的形式,那么它一定可以表示成两个数字的平方和。(2是特殊情况)

    用素数筛打素数,并用以上定理判断是否能表示成平方和,预处理好后,对于每个询问用O(1)时间输出。

    注意边界值可能为负数,负数中没有质数。

    View Code
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    #define maxn 1000005
    
    bool is[maxn];
    int prm[maxn];
    int x[maxn];
    int y[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++] = 2;
        is[0] = is[1] = 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;
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        getprm(1000000);
        x[0] = 0;
        for (int i = 1; i < 1000000; i++)
            if (is[i])
                x[i] = x[i - 1] + 1;
            else
                x[i] = x[i - 1];
        y[2] = 1;
        for (int i = 3; i < 1000000; i++)
            if (is[i] && i % 4 == 1)
                y[i] = y[i - 1] + 1;
            else
                y[i] = y[i - 1];
        int l, u;
        while (scanf("%d%d", &l, &u), ~l || ~u)
        {
            int ll = l - 1;
            ll = max(ll, 0);
            int uu = max(u, 0);
            printf("%d %d %d %d\n", l, u, x[uu] - x[ll], y[uu] - y[ll]);
        }
        return 0;
    }
  • 相关阅读:
    Java 引用类型
    Mysql-5.7.14使用常见问题汇总
    CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用
    HashMap的源码分析
    redis-cluster源码分析
    redis集群方案
    redis集群命令
    redis集群删除master节点
    redis集群添加master节点
    redis集群部署
  • 原文地址:https://www.cnblogs.com/rainydays/p/2755037.html
Copyright © 2011-2022 走看看