• POJ 3292 Semi-prime H-numbers


    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 10194   Accepted: 4533

    Description

    This problem is based on an exercise of David Hilbert, who pedagogically suggested that one study the theory of 4n+1 numbers. Here, we do only a bit of that.

    An H-number is a positive number which is one more than a multiple of four: 1, 5, 9, 13, 17, 21,... are the H-numbers. For this problem we pretend that these are the only numbers. The H-numbers are closed under multiplication.

    As with regular integers, we partition the H-numbers into units, H-primes, and H-composites. 1 is the only unit. An H-number h is H-prime if it is not the unit, and is the product of two H-numbers in only one way: 1 × h. The rest of the numbers are H-composite.

    For examples, the first few H-composites are: 5 × 5 = 25, 5 × 9 = 45, 5 × 13 = 65, 9 × 9 = 81, 5 × 17 = 85.

    Your task is to count the number of H-semi-primes. An H-semi-prime is an H-number which is the product of exactly two H-primes. The two H-primes may be equal or different. In the example above, all five numbers are H-semi-primes. 125 = 5 × 5 × 5 is not an H-semi-prime, because it's the product of three H-primes.

    Input

    Each line of input contains an H-number ≤ 1,000,001. The last line of input contains 0 and this line should not be processed.

    Output

    For each inputted H-number h, print a line stating h and the number of H-semi-primes between 1 and h inclusive, separated by one space in the format shown in the sample.

    Sample Input

    21 
    85
    789
    0

    Sample Output

    21 0
    85 5
    789 62

    Source

     
     
    如果一个数$i$是题目要求的素数
    那么$5*i+4*i*x$一定不是题目要求的素数
    根据这个性质,利用筛素数的方法把不是素数的数筛去
    然后再拿筛出来的数统计答案
    前缀和维护一下
     
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int MAXN=1e6+10;
    const int limit=1e6+10;
    inline int read()
    {
        char ch=getchar();int f=1,x=0;
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int Prime[MAXN],vis[MAXN],sum[MAXN],ans[MAXN];
    int tot=0;
    int main()
    {
        for(int i=5;i<=limit;i+=4)
        {
            if(vis[i])  continue;
            Prime[++tot]=i;
            for(int j=i*5;j<=limit;j+=i*4)
                vis[j]=1;
        }
        for(int i=1;i<=tot;i++)
            for(int j=1;j<=i&&Prime[i]*Prime[j]<=limit;j++)
                ans[Prime[i]*Prime[j]]=1;
        for(int i=1;i<=limit;i++)   sum[i]=sum[i-1]+ans[i];
        int h;
        while(scanf("%d",&h)&&h)
            printf("%d %d
    ",h,sum[h]);
        return 0;  
    }
  • 相关阅读:
    bootstrap
    jQuery快速入门
    前端jQuery
    前端BOM和DOM
    前端js
    前端css
    前端知识之HTML内容
    线程池
    线程
    LightOJ
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7860454.html
Copyright © 2020-2023  润新知