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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值