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 打表(算复杂度)的主要内容,如果未能解决你的问题,请参考以下文章