zoukankan      html  css  js  c++  java
  • POJ 3292, Semiprime Hnumbers

    Time Limit: 1000MS  Memory Limit: 65536K
    Total Submissions: 4166  Accepted: 1652


    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
    Waterloo Local Contest, 2006.9.30


    // POJ3292.cpp : Defines the entry point for the console application.
    //

    #include 
    <iostream>
    #include 
    <cmath>
    using namespace std;

    int main(int argc, char* argv[])
    {
        unsigned 
    long long const SIZE = 1000005;
        unsigned 
    long long MAX = unsigned long (sqrt(SIZE*1.0));
        
    int H[SIZE];
        memset(H, 
    0sizeof(H));
        unsigned 
    long long num;
        
    for (unsigned long long i = 5; i < MAX; i+=4)
        {
            
    for(unsigned long long j = i; (num = i * j )< SIZE; j+=4)
            {
                
    if (H[i] != 0 || H[j] != 0
                    H[num] 
    = -1;
                
    else if (H[num]!=-1)
                    H[num] 
    = 1;
            }
        }

        
    for (int i = 1; i < SIZE; ++i) 
        {
            
    if (H[i] == 1) H[i] = H[i-1+ 1;
            
    else H[i] = H[i-1];
        }

        
    int N;
        
    while(scanf("%d"&N)!=EOF && N!=0)
            cout 
    << N << " " << H[N] << endl;

        
    return 0;
    }


  • 相关阅读:
    ARM处理器
    进程和线程通俗理解
    const与指针
    字符提取命令
    ThinkPHP之视图模版的使用
    ThinkPHP之MVC与URL访问
    ThinkPHP之项目搭建
    android之文件存储和读取
    cryptdb中wrapper.lua的分析
    cryptDB安装分析
  • 原文地址:https://www.cnblogs.com/asuran/p/1587802.html
Copyright © 2011-2022 走看看