poj3292

来源:互联网 发布:怎样学好plc编程 编辑:程序博客网 时间:2024/06/06 02:09

链接:点击打开链接

题意:可以写成4i+1的数为H-number,只能分解成1*本身,不能分解成其他的H-number的数为H-primes,能够恰好分解成两个H-primes的乘积,且只能是两个数的乘积的数为H-semi-primes,输出1-N之间有多少个H-semi-primes

代码:

#include <set>#include <cstdio>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;bool sign[1000005];int num[1000005];set<int> s;set<int>::iterator ite;int main(){    int i,j,k,n,ans;    k=0;    memset(sign,0,sizeof(sign));    for(i=5;i<=200005;i+=4)    for(j=5;j<=200005;j+=4){    if(i*j>1000001)    break;    sign[i*j]=1;    }                           //先把H-number的乘积都标记上    for(i=5;i<=200005;i+=4)    for(j=5;j<=200005;j+=4){        if(i*j>1000001)        break;        if(!sign[i]&&!sign[j]){ //记录两个H-primes的乘积        num[k++]=i*j;        }    }    sort(num,num+k);    k=unique(num,num+k)-num;//    cout<<k<<endl;//    for(i=0;i<100;i++)//    cout<<num[i]<<" ";//    cout<<endl;    while(~scanf("%d",&n)!=EOF&&n){        ans=lower_bound(num,num+k,n)-num;        if(num[ans]==n)         //二分出最后答案        printf("%d %d\n",n,ans+1);        else        printf("%d %d\n",n,ans);    }    return 0;}

0 0
原创粉丝点击