大区间素数筛选 POJ2689
题意:
给一个区间[L,U],(1<=L< U<=2,147,483,647),U-L<=1000000,求出[L,U]内距离近期和距离最远的素数对。
因为L,U都小于2^32,所以区间内的合数的最小质因子必定小于2^16,所以先筛出2^16以内的素数,用筛出来的素数去筛[L,U]内的合数。然后把[L,U]内的素数保存下来,再搜索近期和最远的素数对就可以。注意两整数相乘可能溢出32位,注意对1的推断。
代码:
- #include <cstdlib>
- #include <cctype>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- #include<climits>
- #include <algorithm>
- #include <vector>
- #include <string>
- #include <iostream>
- #include <sstream>
- #include <map>
- #include <set>
- #include <queue>
- #include <stack>
- #include <fstream>
- #include <numeric>
- #include <iomanip>
- #include <bitset>
- #include <list>
- #include <stdexcept>
- #include <functional>
- #include <utility>
- #include <ctime>
- using namespace std;
- #define PB push_back
- #define MP make_pair
- #define REP(i,x,n) for(int i=x;i<(n);++i)
- #define FOR(i,l,h) for(int i=(l);i<=(h);++i)
- #define FORD(i,h,l) for(int i=(h);i>=(l);--i)
- #define SZ(X) ((int)(X).size())
- #define ALL(X) (X).begin(), (X).end()
- #define RI(X) scanf("%d", &(X))
- #define RII(X, Y) scanf("%d%d", &(X), &(Y))
- #define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
- #define DRI(X) int (X); scanf("%d", &X)
- #define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
- #define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
- #define OI(X) printf("%d",X);
- #define RS(X) scanf("%s", (X))
- #define MS0(X) memset((X), 0, sizeof((X)))
- #define MS1(X) memset((X), -1, sizeof((X)))
- #define LEN(X) strlen(X)
- #define F first
- #define S second
- #define Swap(a, b) (a ^= b, b ^= a, a ^= b)
- #define Dpoint strcut node{int x,y}
- #define cmpd int cmp(const int &a,const int &b){return a>b;}
- /*#ifdef HOME
- freopen("in.txt","r",stdin);
- #endif*/
- const int MOD = 1e9+7;
- typedef vector<int> VI;
- typedef vector<string> VS;
- typedef vector<double> VD;
- typedef long long LL;
- typedef pair<int,int> PII;
- //#define HOME
- int Scan()
- {
- int res = 0, ch, flag = 0;
- if((ch = getchar()) == '-') //推断正负
- flag = 1;
- else if(ch >= '0' && ch <= '9') //得到完整的数
- res = ch - '0';
- while((ch = getchar()) >= '0' && ch <= '9' )
- res = res * 10 + ch - '0';
- return flag ? -res : res;
- }
- /*----------------PLEASE-----DO-----NOT-----HACK-----ME--------------------*/
- #define MAXN 100000
- int prime[MAXN];
- int vis[MAXN+5];
- int cnt;
- void getprime()
- {cnt=0;
- for(int i=2;i<=MAXN;i++)
- if(!vis[i])
- {
- prime[cnt++]=i;
- for(int j=0;j<cnt&&prime[j]<=MAXN/i;j++)
- {
- vis[prime[j]*i]=1;
- if(i%prime[j]==0)
- break;
- }
- }
- }
- int notprime[1000000+5];
- int prime2[1000000+5];
- int cnt2;
- void getprime2(int L,int U)
- {
- for(int i=0;i<cnt;i++)
- { if(prime[i]>=U)
- break;
- int s=L/prime[i];
- if(s<=1)
- s=2;
- for(int j=s;(long long)prime[i]*j<=U;j++)
- if((long long )prime[i]*j>=L)
- {
- notprime[(long long )prime[i]*j-L]=1;
- }
- }
- cnt2=0;
- REP(i,0,U-L+1)
- {
- if(!notprime[i]&&(i+L)!=1&&(i+L)!=0)
- prime2[cnt2++]=i+L;
- }
- }
- int main()
- {getprime();
- int L,U;
- while(RII(L,U)!=EOF)
- {
- MS0(notprime);
- getprime2(L,U);
- int ans1=INT_MAX;
- int ans2=0;
- int n1,n2,f1,f2;
- if(cnt2<2)
- {
- printf("There are no adjacent primes.\n");
- continue;
- }
- REP(i,0,cnt2-1)
- {
- if(prime2[i+1]-prime2[i]<ans1)
- {
- ans1=prime2[i+1]-prime2[i];
- n1=prime2[i];
- n2=prime2[i+1];
- }
- if(prime2[i+1]-prime2[i]>ans2)
- {
- ans2=prime2[i+1]-prime2[i];
- f1=prime2[i];
- f2=prime2[i+1];
- }
- }
- printf("%d,%d are closest, %d,%d are most distant.\n",n1,n2,f1,f2);
- }
- return 0;
- }
大区间素数筛选 POJ2689的更多相关文章
- LightOJ1197 Help Hanzo —— 大区间素数筛选
题目链接:https://vjudge.net/problem/LightOJ-1197 1197 - Help Hanzo PDF (English) Statistics Forum Tim ...
- LightOJ 1197 LightOJ 1197(大区间素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1197 题目大意: 就是给你一个区间[a,b]让你求这个区间素数的个数 但a.b的值太大没法直接进 ...
- 大区间素数筛选(POJ 2689)
/* *POJ 2689 Prime Distance *给出一个区间[L,U],找出区间内容.相邻的距离最近的两个素数和距离最远的两个素数 *1<=L<U<=2147483647 ...
- LightOj 1197 Help Hanzo (区间素数筛选)
题目大意: 给出T个实例,T<=200,给出[a,b]区间,问这个区间里面有多少个素数?(1 ≤ a ≤ b < 231, b - a ≤ 100000) 解题思路: 由于a,b的取值范围 ...
- 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)
题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- LightOJ 1197 Help Hanzo(区间素数筛选)
E - Help Hanzo Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit ...
- M - Help Hanzo LightOJ - 1197 (大区间素数筛法)
题解:素数区间问题.注意到a和b的范围是1<<31,所以直接暴力打表肯定不可以.如果一个数是合数,他的两个因子要么是两个sqrt(x),要么就分布在sqrt(x)两端,所以我们可以根据sq ...
- Prime Count 求大区间素数个数
http://acm.gdufe.edu.cn/Problem/read/id/1333 https://www.zhihu.com/question/29580448/answer/44874605
随机推荐
- JMP软件中的晶圆图( Wafer Map)分析
关键词:芯片 良率分析 晶圆图 质量管理 JMP Minitab 半导体芯片的生产,简单来讲,是将电路通过各种复杂的物理化学方法制作到晶圆上,在生产的最后阶段会进行不同电性功能的测试以确保产品的功能性 ...
- HDU 4009 不定根最小树形图
讲一下建图过程,首先建立一个超级源点S,对于这个源点,向每个HOUSE连一条有向边,权值为该HOUSE建立WELL的费用,即高度*X. 然后每个可以连边的WELL之间,费用为曼哈顿距离*Y,然后考虑两 ...
- 【DataStructure In Python】Python模拟链表
最近一直在学习Python和Perl这两门语言,两者共同点很多,也有不多.希望通过这样的模拟练习可以让自己更熟悉语言,虽然很多时候觉得这样用Python或者Perl并没有体现这两者的真正价值. #! ...
- Android开发之ADT中无Annotation Processin的解决办法
使用ButterKnife的时候,进入ADT中设置的时候发现在Java Compiler展开后无Annotation Processin 解决办法: 安装插件:Juno - http://downlo ...
- poj棋盘分割(记忆化)
http://poj.org/problem?id=1191 黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来.. 想偏了 正解:递归 #include <iostream> ...
- BZOJ_1600_[Usaco2008_Oct]_建造栅栏_(动态规划)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1600 将长度为n的线段分成4段,长度为整数,围成面积>0的四边形,求方案数. 分析 首先 ...
- Memcached‘do_item_get’函数安全漏洞
漏洞名称: Memcached‘do_item_get’函数安全漏洞 CNNVD编号: CNNVD-201401-175 发布时间: 2014-01-15 更新时间: 2014-01-15 危害等级: ...
- Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞
漏洞名称: Linux Kernel ‘drivers/staging/wlags49_h2/wl_priv.c’本地缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-068 发布时间: 2 ...
- -_-#【减少 DOM 元素】textarea, script 延迟渲染
淘宝详情页的 BigRender 优化与存放大块 HTML 内容的最佳方式 淘宝详情页的BigRender优化的最佳方式 <!DOCTYPE html> <html> < ...
- HelloXV1.77网络功能简介
HelloXV1.77的网络功能做了较大程度的加强,移植了业界广泛使用的lwIP协议栈,并做了很多优化工作,修正了其中的一些bug.同时,实现了一个network字符界面应用程序,可以对网络功能进行调 ...