題意:
給乙個區間[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 #include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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
#define cmpd int cmp(const int &a,const int &b)
/*#ifdef home
freopen("in.txt","r",stdin);
#endif*/
const int mod = 1e9+7;
typedef vectorvi;
typedef vectorvs;
typedef vectorvd;
typedef long long ll;
typedef pairpii;
//#define home
int scan()
/*----------------please-----do-----not-----hack-----me--------------------*/
#define maxn 100000
int prime[maxn];
int vis[maxn+5];
int cnt;
void getprime()
}cnt2=0;
rep(i,0,u-l+1)
}int main()
rep(i,0,cnt2-1)
}printf("%d,%d are closest, %d,%d are most distant.\n",n1,n2,f1,f2);
} return 0;
}
poj 2689素數篩選
這道題目我就不貼題目了,就是素數篩選題。這道題目差點讓我崩潰,自己太菜的原因,提交了很多次,總是runtime error 後來才知道,素數篩選的範圍這能是2 16,然而這道題給的範圍超出了int的上界,所以,必須要用另外一種方法來篩選,看了人家的部落格,感覺方法超好。這道題有個突破點,就是區間在1...
poj 2689 區間素數篩選
由於給出的l和u太大,直接打表是不可能了。但u l 1e6,u 1e9,可以先篩出 0,sqrt u 內的素數,再以此去篩 l,u 內的素數,接著求出相鄰距離最短和最遠的一對素數就行了,這步就簡單了。如下 include include include include include include...
poj 2689 (素數二次篩選)
sample input 2 17 14 17sample output 2,3 are closest,7,11 are most distant.there are no adjacent primes.找出給定範圍內,距離最遠和最近的素數。不停超時 給的上界很大,所以全處理肯定不行。先處理sq...