zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    从头实现一个简易版的React虚拟dom和diff算法
    如何理解虚拟DOM
    crate-react-app 之 css modules
    react-router-dom
    slider插件 滚动条插件 基于g2-plugin-slider.js修改
    React 在body上绑定事件以及阻止事件冒泡
    React 动态填加class
    python三大器之 迭代器与生成器
    装饰器常用形态(结合装饰器起飞版来看)
    装饰器之起飞版
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107129.html
Copyright © 2011-2022 走看看