1. 程式人生 > >poj 3292 (打表)

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]);
                }
}