1. 程式人生 > >!POJ 2689 Prime Distance-卡時間-(素數篩法)

!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 6053EES

problem 思路 滿足EES篩法的要求 考慮f(p)f(p)f(p)即p1p^1p1是啥,當p&gt;2p&gt;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 Distance2次用

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