zoukankan      html  css  js  c++  java
  • poj3292

    Semi-prime H-numbers
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 8677   Accepted: 3793

    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

    大致题意:

    一个H-number是所有的模四余一的数。

    如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外)。

    一个H-number是H-semi-prime当且仅当它只由两个H-primes的乘积表示。

    H-number剩下其他的数均为H-composite。

    给你一个数h,问1到h有多少个H-semi-prime数。

    解题思路:

    感觉跟同余模扯不上关系。。。

    筛法打表,再直接输出。。。水题。。。

    ps:请用G++提交

    #include<iostream>
    using namespace std;
    const int N=1000001;
    int h,a[N+1];
    int go(){
        for(int i=5;i<=N;i+=4){
            for(int j=5;j<=N;j+=4){
                int tmp=i*j;
                if(tmp>N) break;
                if(!a[i]&&!a[j])//i与j均为H-prime
                    a[tmp]=1; //tmp为H-semi-primes
                else
                    a[tmp]=-1;//tmp为H-composite
            }
        }
        int p=0; //H-prime计数器
        for(int i=1;i<=N;i++){
            if(a[i]==1) p++;
            a[i]=p; //从1到i有p个H-semi-primes
        }
    }
    int main(){
        go();
        while(cin>>h){
            if(!h) break;
            cout<<h<<' '<<a[h]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    模拟登陆江西理工大学教务系统
    python3爬虫 -----华东交大校园新闻爬取与数据分析
    以selenium模拟登陆12306
    PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
    PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
    PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
    PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
    PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
    PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
    PAT (Basic Level) Practice (中文)1037 在霍格沃茨找零钱 (20 分)
  • 原文地址:https://www.cnblogs.com/shenben/p/5641715.html
Copyright © 2011-2022 走看看