题意:有类似4n+1的数(1,5,9,13,17.......),其中只有1和自己本身2个因数叫H-质数,而由2个H-质数乘积
得到的是H-合数,求0-n中,H-合数的个数。比如25=5X5 而5只有1和5这2个因数。
#include<stdio.h>
#define MAX 1000001
int vis[MAX],Num[MAX];
void solve(void)
{
int count=0;
int i,j;
memset(vis,0,sizeof(vis));
for(i=5;i<=MAX;i+=4) //从1开始,没有意义,i*4n+1=4n+1无法判断。 i和j分别枚举4n+1的数,2个4n+1数的相乘,如果i,j都是H-质数(就是vis[i],vis[j]没被赋值的)
for(j=5;j<=MAX;j+=4) // 那么i*j就是H-合数。
{
if(i*j>MAX) //如果i*j超了范围,那么j++之后的也超范围,所以直接结束这次循环
break;
if(!vis[i]&&!vis[j]) //如果有了标记,说明这I,j其中至少一个是H-合数或者H-混合数 所得的乘积一定不是H-合数,而是H-混合数是(超过2个H-质数相乘的数)
{
vis[i*j]=1;
}
else
{
vis[i*j]=-1;
}
}
for(i=0;i<MAX;i++) //已经知道 i 是不是H-合数 ,遍历一遍,计算i之前有多少个H-合数 储存在Num[i]里
{
if(vis[i]==1)
count++;
Num[i]=count;
}
}
int main(void)
{
int a;
solve();
while(~scanf("%d",&a)&&a)
{
printf("%d %d\n",a,Num[a]);
}
}