poj3292(筛法+打表)
题目链接: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代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; const int maxn=;
int h,vis[maxn],prime1[maxn],cnt1,prime2[maxn],cnt2; void Prime(){
memset(vis,,sizeof(vis));
for(int i=;i<=;i+=){
if(vis[i]) prime1[cnt1++]=i;
for(int j=;j<cnt1&&i*prime1[j]<=;++j){
vis[i*prime1[j]]=;
if(i%prime1[j]==) break;
}
}
memset(vis,,sizeof(vis));
for(int i=;i<cnt1;++i){
int tmp=/prime1[i];
for(int j=i;j<cnt1&&prime1[j]<=tmp;++j)
vis[prime1[i]*prime1[j]]=;
}
for(int i=;i<=;i+=)
if(vis[i])
prime2[cnt2++]=i;
} int bs(int x){
if(x<) return ;
int l=,r=cnt2-,m;
while(l<=r){
m=(l+r)>>;
if(x>=prime2[m]&&x<prime2[m+]) break;
if(x<prime2[m]) r=m-;
else l=m+;
}
return m+;
} int main(){
Prime();
prime2[cnt2]=0x3f3f3f3f;
while(~scanf("%d",&h),h){
printf("%d ",h);
printf("%d\n",bs(h));
}
return ;
}
poj3292(筛法+打表)的更多相关文章
- poj3292-Semi-prime H-numbers(筛法打表)
一,题意: 一个H-number是所有的模四余一的数.(x=4*k+1) 如果一个H-number是H-primes 当且仅当它的因数只有1和它本身(除1外). 一个H-number是H-semi ...
- 【Difference Between Primes HDU - 4715】【素数筛法打表+模拟】
这道题很坑,注意在G++下提交,否则会WA,还有就是a或b中较大的那个数的范围.. #include<iostream> #include<cstdio> #include&l ...
- 数学#素数筛法 HDU 4548&POJ 2689
找素数本来是很简单的问题,但当数据变大时,用朴素思想来找素数想必是会超时的,所以用素数筛法. 素数筛法 打表伪代码(用prime数组保存区间内的所有素数): void isPrime() vis[]数 ...
- UVa 294 - Divisors 解题报告 c语言实现 素数筛法
1.题目大意: 输入两个整数L.H其中($1≤L≤H≤10^9,H−L≤10000$),统计[L,H]区间上正约数最多的那个数P(如有多个,取最小值)以及P的正约数的个数D. 2.原理: 对于任意的一 ...
- poj3292
Semi-prime H-numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8677 Accepted: 3 ...
- Mathematics:Prime Path(POJ 3126)
素数通道 题目大意:给定两个素数a,b,要你找到一种变换,使得每次变换都是素数,如果能从a变换到b,则输出最小步数,否则输出Impossible 水题,因为要求最小步数,所以我们只需要找到到每个素数的 ...
- HDU 5317 RGCDQ (数论素筛)
RGCDQ Time Limit: 3000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status ...
- POJ 2154 【POLYA】【欧拉】
前记: TM终于决定以后干啥了.这几天睡的有点多.困饿交加之间喝了好多水.可能是灌脑了. 切记两件事: 1.安心当单身狗 2.顺心码代码 题意: 给你N种颜色的珠子,串一串长度问N的项链,要求旋转之后 ...
- NOIP算法总结
前言 离NOIP还有一个星期,匆忙的把寒假整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.旁边的同学都劝我不要再放PASCAL啊什么的了,毕竟我们的 ...
随机推荐
- python的回调callback
python的回调callback很强大,特别是函数参数可以是kw,因为一个函数编译后对应函数对象,函数对象中包含了参数的信息,当你调用函数时,会判断传入参数是否正确.通过导入模块,可以使用模块中的函 ...
- Gson 解决时间解析问题
异常: at org.eclipse.jdt.) at org.eclipse.jdt.) Caused by: java.text.ParseException: Failed to parse d ...
- Spring和SpringMVC的常用注解
Spring的部分: 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包). <context:component-scan base-package=" ...
- 07-border(边框)
边框 边框有三个要素: 粗细.线性样式.颜色 border: solid 如果颜色不写,默认是黑色. 如果粗细不写,不显示边框. 如果只写线性样式,默认的有上下左右 3px的宽度,实体样式,并且黑色的 ...
- APP-8.1-百度语音应用
1.百度语音登录地址 http://yuyin.baidu.com/ 2.控制台创建应用 3.生成签名 3.1Postman软件应用 APP-8.2-Postman应用 3.2Postman执行 UR ...
- C#--构造函数的理解
说白了构造函数就是用来初始化类的数据成员{因为C#语言具有类型安全的特质-->不能使用没有初始化的变量)} 在这里引用一下别人的总结,我觉得挺好的: 构造函数是一种特殊的成员函数,它主要用于为对 ...
- ubuntu安装pgAdmin 4
One way to install pgadmin4 is to download its Python wheel at https://www.postgresql.org/ftp/pgadmi ...
- aaad
I remember the wonderful moment you appeared before me, like a fleeting vision, like a genius of pur ...
- ACM__最小生成树之prime
今天做了一道题,根本没想到最小生成树,稀里糊涂的浪费了很多时间,复习一下 转载自https://www.cnblogs.com/zhangming-blog/p/5414514.html Prim算法 ...
- join和子查询的一点点思考
代码和表设计过程中,为了考虑数据库的范式,通常导致需要join多张表或子查询, 如报表场景, 可此种方式在大数据量的 情况下,效率较低. 如果能做适量的数据冗余,便可以减少join或子查询,效率较高 ...