poj 3292 (打表)
題意:有類似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]);
}
}