[POJ3292]Semi-prime H-numbers

来源:互联网 发布:淘宝店铺转让的风险 编辑:程序博客网 时间:2024/05/21 09:09

原题链接

又是一道英文题
总之就
上翻译器吧

大体解释一下原题
形如4n+1的数叫做H数
乘法在H数组成的集合内是封闭的
H数中只能被1和本身整除的数叫H素数
剩下的叫H合数
其中能且仅能分解成两个H素数H合数叫做H合成数

给你若干个数h
求在0~h范围内的H合成数的个数

利用筛选法求出H素数
[若i是H素数,那么5i+4i*x一定是H数但不是H素数]

然后两两相乘
处理出H合成数

预处理出每个范围内的H合成数的数量
直接输出

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MAX 1000001#define LL long longusing namespace std;int i,j,Hprime[MAX+10],Hprime_num[MAX+10],Hmix[MAX+10],Hnum[MAX+10],n,tot;int main(){    for(i=5;i<=MAX;i+=4)    {        if(Hprime[i]) continue;        tot++;        Hprime_num[tot]=i;        for(j=i*5;j<=MAX;j+=i*4)            Hprime[j]=1;    }    for(i=1;i<=tot;i++)        for(j=1;j<=i&&Hprime_num[i]*Hprime_num[j]<=MAX;j++)        {            int t=Hprime_num[i]*Hprime_num[j];            Hmix[t]=1;        }    for(i=1;i<=MAX;i++)        Hnum[i]=Hnum[i-1]+Hmix[i];    scanf("%d",&n);    while(n)    {        printf("%d %d\n",n,Hnum[n]);        scanf("%d",&n);    }       return 0;} 
原创粉丝点击