题目链接: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