zoukankan      html  css  js  c++  java
  • POJ 3292

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

    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

     
     
    仿照素数的埃氏筛选法即可
     
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 
     6 using namespace std;
     7 
     8 #define maxn 1000005
     9 
    10 bool H[maxn];
    11 int ans[maxn],ele[maxn];
    12 int len = 0;
    13 
    14 
    15 void init() {
    16 
    17         for(int i = 1; i <= maxn - 5; i++) {
    18                 H[i] = (i % 4 == 1);
    19         }
    20 
    21         for(int i = 5; i * i <= maxn - 5; i += 4) {
    22                 if(!H[i]) continue;
    23                 for(int j = i; j * i <= maxn - 5; j++) {
    24                         H[j * i] = 0;
    25                 }
    26         }
    27 
    28         for(int i = 5; i <= maxn - 5; i += 4) {
    29                 if(H[i]) {
    30                         ele[len++] = i;
    31                 }
    32         }
    33 
    34         for(int i = 0; i < len && ele[i] * ele[i] <= maxn - 5; i++) {
    35                 for(int j = i; j < len && ele[j] * ele[i] <= maxn - 5; j++) {
    36                         if(ele[i] * ele[j] % 4 == 1)
    37                         ans[ ele[i] * ele[j] ] = 1;
    38                 }
    39         }
    40 
    41         for(int i = 0; i <=  maxn - 5; i++) {
    42                 ans[i] += ans[i - 1];
    43         }
    44 }
    45 
    46 int main() {
    47        // freopen("sw.in","r",stdin);
    48 
    49         init();
    50 
    51         int x;
    52         while(~scanf("%d",&x) && x) {
    53                 printf("%d %d
    ",x,ans[x]);
    54         }
    55 
    56         return 0;
    57 
    58 }
    View Code
  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/3592625.html
Copyright © 2011-2022 走看看