Semi-prime H-numbers POJ - 3292 打表(算复杂度)

Posted ttttttttrx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Semi-prime H-numbers POJ - 3292 打表(算复杂度)相关的知识,希望对你有一定的参考价值。

题意:参考https://blog.csdn.net/lyy289065406/article/details/6648537

一个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数。
思路  :直接暴力打表 因为h <=1e6  而  打表的复杂度是 log4(h)*log4(h)所以 不会超时  不要误以为是n^2的复杂度

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<cmath>
 5 #include<iostream>
 6 using namespace std;
 7 const int maxn=1e6+1000;
 8 int H_primes[maxn+1];
 9 int vis[maxn+1];
10 int ans[maxn];
11 int cnt;
12 void init(){
13     cnt=0;
14     for(int i=5;i<=maxn;i+=4){
15         for(int j=5;j<=maxn;j+=4){
16             int mul=i*j;
17             if(mul>maxn)break;
18             if(H_primes[i]==0&&H_primes[j]==0)
19                 H_primes[mul]=1;
20             else H_primes[mul]=-1;
21         }
22 
23     }
24     for(int k=1;k<=maxn;k++){
25         if(H_primes[k]==1)
26             cnt++;
27         ans[k]=cnt;
28     }
29 }
30 int main(){
31     init();
32     int n;
33     while(scanf("%d",&n)==1&&n){
34         printf("%d %d
",n,ans[n]);
35     }
36     return 0;
37 }

 


以上是关于Semi-prime H-numbers POJ - 3292 打表(算复杂度)的主要内容,如果未能解决你的问题,请参考以下文章

POj3292 Semi-prime H-numbers

POJ3292 Semi-prime H-numbers

POJ 3292 Semi-prime H-numbers

POJ 3292 Semi-prime H-numbers

poj 3292 Semi-prime H-numbers

POJ3292 Semi-prime H-numbers