ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 UVA11105 【H-半素数 Semi-prime H-numbers】

2019-09-07 14:56:42  阅读:169  来源: 互联网

标签:prime Semi int 题解 枚举 素数 Max include


做这道题之前首先要掌握的是线性筛的模板

附上题目链接

https://www.luogu.org/problem/P3383

首先这道题目的范围有些特殊必须是% 4 == 1的数才行

所以可以这样

直接把线性筛的模板拿过来将里面的每个数挨个枚举,每一次的++i 或者++j可以改为 += 4

这样每一次枚举的就都是“H数 ”了

然后不考虑“H数 ”之外的数,用这里面的数进行素数筛选 将H-素数都筛出来

在最后的时候两重循环枚举素数将他们的乘积标注出来最后 剩下的H数就都会是H-合数了

完整代码

#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;
const int Max = 1000005;
const int M = 1000001;
int ans[Max];
bool use[Max];
bool vis[Max];
int prime[Max];
int a[Max];
int js = 0;
int main()
{
    int tot = 0;
    for(int i = 5;i <= M;i += 4)
    {
        if(use[i] == true)continue; 
        prime[++ tot] = i;
        for(int j = 1;j * i <= M;j += 4)//线性筛模板晒出H-素数 
            use[i * j] = true;
    }
    for(int i = 1;i <= tot;i ++)
    {
        for(int j = 1;j <= tot;j ++)//双重循环枚举 
        {
            if(prime[i] * prime[j] > M)break;//大于最大的范围break掉这一层循环 
            vis[prime[i] * prime[j]] = 1;//标记出来 
        }
    }
    for(int i = 1;i <= M;++ i)
    {
        ans[i] += ans[i - 1];//先继承前面H-合数的个数 
        if(vis[i] == true)//如果当前的数也是H-合数 
        ans[i] ++;//计数器累加 
    }
    int n;
    while(scanf("%d",&n))
    {
        if(n == 0)break;
        else
        cout<<n<<" "<<ans[n]<<endl;
    }
    return 0;
}

 

标签:prime,Semi,int,题解,枚举,素数,Max,include
来源: https://www.cnblogs.com/acioi/p/11480767.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有