poj3292 (H数)筛法

来源:互联网 发布:加内特巅峰数据 编辑:程序博客网 时间:2024/06/10 22:06
/*问题描述形如4n+1的数被称为“H数”,乘法在“H数”组成的集合内是封闭的。在这个集合中只能被1和本身整除的数叫做“H-素数”(不包括1,H-素数并不是真正的素数,而是在H数集合中是素数),其余的数被称为“H-合数”。一个“H-合成数”是一个能且只能分解成两个“H-素数”乘积的“H-合数”(可能有多种分解方案)。比如441=21*21=9*49,所以441是“H-合成数”。125=5*5*5,所以125不是“H-合成数”。求0~h范围内“H-合成数”的个数。输入格式输入若干行,每行一个小于等于1000001的整数h,一个0表示结束。输出格式对于每一行输入,输出一个数,表示答案。 Sample Input21 857890Sample Output21 085 5789 62*/#include<cstdio>#include<iostream>using namespace std;int n;bool is_prime[1000100];//大约1M空间,是否为h素数 bool is_con[1000100];int main(){//一次预处理 for(int i=5;i<1000002/5;i+=4)if(!is_prime[i])for(int j=5;i*j<1000002;j+=4)is_prime[i*j]=true;for(int i=5;i*i<1000002;i+=4)if(!is_prime[i])for(int j=i;i*j<1000002;j+=4)if(!is_prime[j])is_con[i*j]=true;while(scanf("%d",&n)&&n){int ans=0;for(int i=5;i<=n;i+=4)if(is_con[i]) ans++;printf("%d %d\n",n,ans);}return 0;}

1 0
原创粉丝点击