您的位置:首页 > 其它

poj 数论 Semi-prime H-numbers

2013-09-11 14:08 387 查看
题意:H-number是4*n+1这样的数,如1,5,9,13...
。H-primes是这样一个H-number:它只能唯一分解成1*它本身,而不能表示为其他两个H-number的乘积。一个H-semi-prime是一个这样的H-number:它正好能表示成两个H-primes的乘积(除了1*它本身),这种表示法可以不唯一,但它不能表示为3个或者以上H-primes的乘积。现在给出一个数n,要求区间[1,n]内有多少个H-semi-prime。
思路:和求素数的筛选法相似,第一次筛选出H_primes。然后再枚举每两个H_primes构造出H_semi_prime,也可以用第二次筛选出H_semi_prim。
注意到X为H-semi-prime当且仅当X=i*j且i和j都为H-prime
而当t为H-prime时,当且仅当t有两个因子——1和t
且当t为H-semi-prime时,t必然是H-composites,所以,不用将H-composites和H-semi-prime分开处理
#include
<iostream>
using namespace
std;
int
prime[1000010];
int
hprime[1000010];
void
solve()
{
   
int i;
   
for(int i=5;i<=1001;i+=4)
   
{

       
for(int j=i;i*j<=1000001;j+=4)
       
{
           
if(prime[i]==0&&prime[j]==0)
             
prime[i*j]=1;
             
else
             
prime[i*j]=2;
       
}
   
}
   
for(i=1;i<=1000001;i++)
   
{
       
if(prime[i]==1)
       
hprime[i]=hprime[i-1]+1;
       
else
       
hprime[i]=hprime[i-1];
   
}
}
int main()
{
   
int h;
   
solve();
   
while(cin>>h)
   
{

       
if(h==0)
       
break;
       
cout<<h<<"
"<<hprime[h]<<endl;
   
}
   
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: