!POJ 2689 Prime Distance-卡時間-(素數篩法)
題意:給定兩個數l,r求這之間最近和最遠的兩個素數。資料範圍是整數的上限。r-l<=10^6
分析:總思路是把l和r間的素數全部找出來,然後遍歷一遍求最小距離和最大距離。用一個函式預處理資料範圍內的所有素數是不現實的,一來陣列不可r能開那麼大二來會超時。想想素數篩的思想:用sqrt(n)以內的素數篩掉n以內的所有合數,剩下n以內的素數。這裡既然預處理不可能,我們一樣可以用sqrt(n)以內的素數來篩,只是這時這些素數預處理,然後每次輸入l和r的時候用預處理的素數篩掉l和r之間的合數,剩下素數。sqrt(n)為2^16,也就是65536不會超時。
關鍵在於l,r之間的素數篩。還是用vis[]陣列來做。直接用兩個迴圈遍歷 l~r 和 prim[] 估算一下應該是會超時的,所以用到一點優化技巧就是遍歷l~r的時候每次加prim[i],而不是加1
程式碼:
#include<iostream> #include<cstring> using namespace std; long long l,r,vis[5000003],l1,l2,r1,r2,init; int prim[500005],mi,mx,cnt; void is_prim() { memset(vis,1,sizeof(vis)); cnt=0; for(int i=2;i<=50000;i++){ if(vis[i]){ prim[cnt++]=i; for(int j=2;j*i<=50000;j++) vis[j*i]=0; } } } int main() { is_prim(); while(cin>>l>>r){ for(int i=0;i<r-l+1;i++) vis[i]=1; if(l==1) vis[0]=0; for(int i=0;i<cnt&&prim[i]*prim[i]<=r;i++){ for(long long j=(long long)max((long long)(prim[i]<<1),(l+prim[i]-1)/prim[i]*prim[i]);j<=r;j+=prim[i]) vis[j-l]=0; } init=-1; mx=-1,mi=10000000; for(int i=0;i<r-l+1;i++){ if(vis[i]){ if(init!=-1){ if(mi>i-init){ mi=i-init; l1=init+l; r1=i+l; } if(mx<i-init){ mx=i-init; l2=init+l; r2=i+l; } } init=i; } } if(mx==-1) cout<<"There are no adjacent primes."<<endl; else cout<<l1<<","<<r1<<" are closest, "<<l2<<","<<r2<<" are most distant."<<endl; } }
相關推薦
!POJ 2689 Prime Distance-卡時間-(素數篩法)
題意:給定兩個數l,r求這之間最近和最遠的兩個素數。資料範圍是整數的上限。r-l<=10^6 分析:總思路是把l和r間的素數全部找出來,然後遍歷一遍求最小距離和最大距離。用一個函式預處理資料範圍內的所有素數是不現實的,一來陣列不可r能開那麼大二來會超時。想想素數篩的思
3292 Semi-prime H-numbers(素數篩法)
先求所有的H-pirme,所有的H-prime兩兩相乘打表。 注: 1、H-numbers是所有除以4餘1的數,而H-prime則是隻能在這些H-numbers中分解因式只得到1*本身的數(1除外)。所以9也是H-prime(原來理解錯了)。 2、 H-semi-prim
POJ 2689 Prime Distance(素數區間篩法--經典題)
大致題意:給定[L,R]區間,找出區間內的每個素數 資料範圍 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的數值太大,所以不能直接篩
poj 2689 Prime Distance(大數區間素數篩法)
題意:給定區間[L,R],求區間內距離最近的相鄰素數對和距離最遠的相鄰素數對,區間長度不超過1e6。 解題方案:用篩法求出[L,R]的所有素數——利用“合數n一定有小於或等於sqrt(n)的素數因子“這條性質,先預處理出sqrt(2,147,483,647)範圍內的所有素
POJ 2689 Prime Distance (二次?篩素數)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2689 Description
poj - 2689 Prime Distance
ans air stream string its put cau rime memset The branch of mathematics called number theory is about properties of numbers. One of the a
POJ 2689 - Prime Distance - [篩法求素數]
代碼 one mini rop esc imu script less ogr 題目鏈接:http://poj.org/problem?id=2689 Time Limit: 1000MS Memory Limit: 65536K Description The branc
POJ 2689 Prime Distance
The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of n
POJ 2689 Prime Distance【素數篩】
The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticia
POJ 2689 Prime Distance [篩法選取素數]【數論】
題目連結:http://poj.org/problem?id=2689 ————————-. Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1
Poj.2689 Prime Distance【素數篩選】 2015/11/13
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14884 Accepted: 3949 Description The branch of mathematic
POJ 2689 - Prime Distance - [埃篩]
only namespace sting typedef led print it is visible define 題目鏈接:http://poj.org/problem?id=2689 Time Limit: 1000MS Memory Limit: 65536K
POJ 3292 Semi-prime H-numbers(類素數篩法)
Description This problem is based on an exercise of David Hilbert, who pedagogically suggested tha
歐拉篩法(線性篩法)與解積性函數
日常 rime ++ 下午 nbsp http image 發現 details 日常吐槽:嘖嘖嘖今天真是玄幻的一天。早上睡到9:10發現睡過了一個半小時,在9:30狂奔來機房 + 吃早餐,最後只剩一個半小時心態崩—>光榮爆零???又在下午四點把全部題改完
洛谷P2568 GCD(線性篩法)
題目連結:傳送門 題目: 題目描述 給定整數N,求1<=x,y<=N且Gcd(x,y)為素數的數對(x,y)有多少對. 輸入輸出格式 輸入格式: 一個整數N 輸出格式: 答案 輸入輸出樣例 輸入樣例#1: 複製 4 輸出樣例#1: 複製 4 說明 對於
【模板】尤拉篩法(線性篩法)
1 int n; 2 int p[MAX_N], cnt; 3 bool b[MAX_N]; 4 5 void Euler() 6 { 7 b[0] = b[1] = 1; 8 for(register int i = 2; i <= n; ++i) 9
【模板】歐拉篩法(線性篩法)
urn col 情況 reg spa bre 歐拉篩法 () 需要 1 int n; 2 int p[MAX_N], cnt; 3 bool b[MAX_N]; 4 5 void Euler() 6 { 7 b[0] = b[1] = 1; 8
Loj 6053(EES篩法)
problem 思路 滿足EES篩法的要求 考慮f(p)f(p)f(p)即p1p^1p1是啥,當p>2p>2p>2時,f(p)=p−1f(p)=p-1f(p)=p−1,而f(2)=3f(2)=3f(2)=3 所以預處理出p1,
51nod 1181 質數中的質數(質數篩法)
原題 參考了網上的大概縷清了思路,用自己的方法做一直都是編譯錯誤,不是很懂,請求大佬指點。 解題思路:首先建立prime[]陣列,用於判斷陣列中的下標所對應的值是質數還是非質數。若為質數,則標記為0,否則標記為1。 從2開始依次判斷,若該數為質數,則計數變數加1,再判斷
2689 Prime Distance(2次用篩法)
The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for