题目链接:https://vjudge.net/problem/POJ-3292

题意:定义4n+1数(简称H数),H数分为三类:unit,即为1; H-primes,只能分解为1×自身,类似于我们平时说的素数; H-composites,除unit和H-primes数以外的H数。输入h,求[1,h]之间的H-composites数的个数。

思路:写了我3个多小时,因为题目理解错误和代码错误,写得崩溃。。QAQ。先说我想到的正确解法,注意到H-primes和我们说的素数基本类似,所以我们可以用欧筛法打表求出所有的H-primes,然后打表求出所有的H-composites,方法是枚举所有素数,如果这两个素数的乘积小于1e6+1,则记录为H-composites,要注意的是这里的判断不能写prime1[i]*prime[j]<=1000001,因为prime1[i]*prime[j]可能超出int范围,然后会导致段错误,所以应该除法判断(见代码)。然后对每一组输入h,二分查找<=h的最大H-composites数,它的下标+1即有多少个<=h的H-composites数,即所求结果。

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. const int maxn=;
  7. int h,vis[maxn],prime1[maxn],cnt1,prime2[maxn],cnt2;
  8.  
  9. void Prime(){
  10. memset(vis,,sizeof(vis));
  11. for(int i=;i<=;i+=){
  12. if(vis[i]) prime1[cnt1++]=i;
  13. for(int j=;j<cnt1&&i*prime1[j]<=;++j){
  14. vis[i*prime1[j]]=;
  15. if(i%prime1[j]==) break;
  16. }
  17. }
  18. memset(vis,,sizeof(vis));
  19. for(int i=;i<cnt1;++i){
  20. int tmp=/prime1[i];
  21. for(int j=i;j<cnt1&&prime1[j]<=tmp;++j)
  22. vis[prime1[i]*prime1[j]]=;
  23. }
  24. for(int i=;i<=;i+=)
  25. if(vis[i])
  26. prime2[cnt2++]=i;
  27. }
  28.  
  29. int bs(int x){
  30. if(x<) return ;
  31. int l=,r=cnt2-,m;
  32. while(l<=r){
  33. m=(l+r)>>;
  34. if(x>=prime2[m]&&x<prime2[m+]) break;
  35. if(x<prime2[m]) r=m-;
  36. else l=m+;
  37. }
  38. return m+;
  39. }
  40.  
  41. int main(){
  42. Prime();
  43. prime2[cnt2]=0x3f3f3f3f;
  44. while(~scanf("%d",&h),h){
  45. printf("%d ",h);
  46. printf("%d\n",bs(h));
  47. }
  48. return ;
  49. }

poj3292(筛法+打表)的更多相关文章

  1. poj3292-Semi-prime H-numbers(筛法打表)

    一,题意:  一个H-number是所有的模四余一的数.(x=4*k+1)  如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外). 一个H-number是H-semi ...

  2. 【Difference Between Primes HDU - 4715】【素数筛法打表+模拟】

    这道题很坑,注意在G++下提交,否则会WA,还有就是a或b中较大的那个数的范围.. #include<iostream> #include<cstdio> #include&l ...

  3. 数学#素数筛法 HDU 4548&POJ 2689

    找素数本来是很简单的问题,但当数据变大时,用朴素思想来找素数想必是会超时的,所以用素数筛法. 素数筛法 打表伪代码(用prime数组保存区间内的所有素数): void isPrime() vis[]数 ...

  4. UVa 294 - Divisors 解题报告 c语言实现 素数筛法

    1.题目大意: 输入两个整数L.H其中($1≤L≤H≤10^9,H−L≤10000$),统计[L,H]区间上正约数最多的那个数P(如有多个,取最小值)以及P的正约数的个数D. 2.原理: 对于任意的一 ...

  5. poj3292

    Semi-prime H-numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8677   Accepted: 3 ...

  6. Mathematics:Prime Path(POJ 3126)

    素数通道 题目大意:给定两个素数a,b,要你找到一种变换,使得每次变换都是素数,如果能从a变换到b,则输出最小步数,否则输出Impossible 水题,因为要求最小步数,所以我们只需要找到到每个素数的 ...

  7. HDU 5317 RGCDQ (数论素筛)

    RGCDQ Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status ...

  8. POJ 2154 【POLYA】【欧拉】

    前记: TM终于决定以后干啥了.这几天睡的有点多.困饿交加之间喝了好多水.可能是灌脑了. 切记两件事: 1.安心当单身狗 2.顺心码代码 题意: 给你N种颜色的珠子,串一串长度问N的项链,要求旋转之后 ...

  9. NOIP算法总结

    前言 离NOIP还有一个星期,匆忙的把寒假整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.旁边的同学都劝我不要再放PASCAL啊什么的了,毕竟我们的 ...

随机推荐

  1. 03.设计模式_抽象工厂模式(Abstract Fcatory)

    抽象工厂模式:创建一些列相关或者互相依赖的对象的接口,而无需指定他们具体的类, 1.创建工厂Factory: package patterns.design.factory; import java. ...

  2. oracle的备份与恢复

    转自:https://blog.csdn.net/kepa520/article/details/78958029 dba的职责: 1.安装和升级oracle数据库 2.建库.表空间.表.视图.索引. ...

  3. requirements.txt 的使用与创建

    1. requirements.txt  主要是记录你的python 解释器安装了那些第三方模块,这样好方便项目迁移,自动解决掉项目的依赖关系 2. 网上找的那些关于 requirements 的文档 ...

  4. Spring boot 配置嵌入式Servlet容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 1.修改和server有关的配置(ServerProperties[也是EmbeddedServletContainerCust ...

  5. zookeeper windows7下集群搭建

    模拟分布式环境!!!  搞了好几天,各种错误!!终于成功了. 环境: windows7 /centos/xsheel    安装了三个虚拟机... 1.下载zookeeper http://archi ...

  6. 3.有关于Python列表简述

    一..title() [让所选择的列表元素的第一个字母大写] test = ['no1','No2','No3','No4'] book = "This My " + test[0 ...

  7. C++17尝鲜:变长 using 声明

    using 声明 先来看 using 声明在类中的应用: 代码1 #include <iostream> using namespace std; struct A { void f(in ...

  8. 【378】python any() and all()

    Reference: [1] Python all() - Python Standard Library [2] Python any() - Python Standard Library all ...

  9. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  10. Python异常和调试.md

    异常捕获 try 基本概念 我们使用try except来捕获异常,python的try except有几个特点: 不管函数内部嵌套几层,只要在try的范围内就可以被捕获.这句话的意思是一个函数被tr ...