题目链接:http://poj.org/problem?id=3292
题目大意:就是给你一个模4余1的数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-semi-prime用1标记。最后统计。。。。。。。
code
#include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> using namespace std; int countt=0; int prime[1000010]; int a[1000010]; void f() //打表函数 { int i,j; int sum=0; memset(prime,0,sizeof(prime)); for(i=5;i<=1000001;i=i+4) { for(j=5;j<=1000001;j+=4) { if(i*j>1000001) { break; } else { if(prime[i]==0&&prime[j]==0) //如果这两个数不是H-semi-prime就把他们的积标记唯一 { prime[i*j]=1; } else { prime[i*j]=-1; //标记为-1以防被当做H-primes用来计算。。。。 } } } } for(i=0;i<=1000001;i++) { if(prime[i]==1) { sum++; } a[i]=sum; } } int main() { int n; f(); while(scanf("%d",&n)==1&&n) { printf("%d %d\n",n,a[n]); } return 0; }
原文地址:http://blog.csdn.net/u010304217/article/details/38070821