• POJ:3292-Semi-prime H-numbers(艾氏筛选法拓展)


    Semi-prime H-numbers

    Time Limit: 1000MS Memory Limit: 65536K
    Total Submissions: 10466 Accepted: 4665

    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


    解题心得:

    1. 题意:
      • 如果一个数是4*n+1,那么这个数是H-number
      • 如果一个数是H-number且这个数是一个素数,那么这个数是H-prime
      • 如果一个数是H-number且这个数的因子仅仅有两个H-prime那么这个数是H-semi-prime(不包括1和他本身)
      • H-number剩下的数是H-composite
    2. 其实就是一个艾氏筛选法的拓展,可以借鉴素数筛选。

    #include <algorithm>
    #include <stdio.h>
    #include <cstring>
    using namespace std;
    const int maxn = 1e6+100;
    int prim[maxn];
    
    void get_h_prim() {
        for(int i=5;i<maxn;i+=4)
            for(int j=5;j<maxn;j+=4) {
                long long temp = i*j;
                if(temp > maxn)
                    break;
                if(prim[i] == prim[j] && prim[i] == 0)
                    prim[temp] = 1;
                else
                    prim[temp] = -1;
            }
    
        int cnt = 0;
        for(int i=0;i<maxn;i++) {
            if(prim[i] == 1)
                cnt++;
            prim[i] = cnt;
        }
    }
    
    int main() {
        get_h_prim();
        int n;
        while(scanf("%d",&n) && n) {
            printf("%d %d
    ",n,prim[n]);
        }
        return 0;
    }
  • 相关阅读:
    shell脚本之redis自动安装
    脚本系列之jdk安装脚本
    Hibernate查询方式汇总(一)
    LDA数学八卦笔记(一)Gamma函数
    软工实践寒假作业(1/2)
    结对项目-四则运算 “软件”之升级版
    第三次作业:个人项目-小学四则运算 “软件”之初版
    分布式版本控制系统Git的安装与使用
    第一次作业
    分布式版本控制系统Git的安装与使用
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107129.html
Copyright © 2020-2023  润新知