poj 2689 區間素數篩選

2021-06-29 08:13:48 字數 1662 閱讀 9752

由於給出的l和u太大,直接打表是不可能了。但u-l<=1e6,u<1e9,可以先篩出[0,sqrt(u)]內的素數,再以此去篩[l,u]內的素數,接著求出相鄰距離最短和最遠的一對素數就行了,這步就簡單了。

**如下:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define ull unsigned long long

#define sz(x) (int)x.size()

#define lowbit(x) ((x) & (-x))

#define mp(a, b) make_pair(a, b)

#define ms(arr, num) memset(arr, num, sizeof(arr))

#define pb push_back

#define f first

#define s second

#define rop freopen("input.txt", "r", stdin);

#define mid(a, b) (a + ((b - a) >> 1))

#define lc rt << 1, l, mid

#define rc rt << 1|1, mid + 1, r

#define lrt rt << 1

#define rrt rt << 1|1

#define bitcount(x) __builtin_popcount(x)

#define bitcountll(x) __builtin_popcountll(x)

#define leftpos(x) 32 - __builtin_clz(x) - 1

#define leftposll(x) 64 - __builtin_clzll(x) - 1

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

using namespace std;

const double eps = 1e-8;

const int maxn = 300 + 10;

const int mod = 1000007;

const int m=1e6+10;

const int n=25;

typedef pairpii;

int n;

bool p1[m],p2[m];

bool judge(ll l,ll r,ll &x1,ll &x2,ll &y1,ll &y2)

}ll a,b;

ll maxx=-1,minn=inf;

for (i=max(2ll,l) ;i<=r;i++)

}for (;i<=r;i++)

a=b;}}

if (maxx>0) return true;

else return false;

}int main()}/*

in: 21 45645

out: 29 31 31397 31469

*/

POJ 2689 區間篩選質數

題意 給定區間 l,u 中,求相鄰兩個質數的 最大 小 差值 所對應的質數 有多組 l,u 規模 1 l u 2,147,483,647,區間長度 1,000,000.型別 經典的區間篩選質數 分析 定理 所有的合數都可以拆分為n個質數的乘積 從l,u的大小 2的32次 明白 最大的質因子 2的16...

大區間素數篩選 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 內的素數儲...

poj 2689素數篩選

這道題目我就不貼題目了,就是素數篩選題。這道題目差點讓我崩潰,自己太菜的原因,提交了很多次,總是runtime error 後來才知道,素數篩選的範圍這能是2 16,然而這道題給的範圍超出了int的上界,所以,必須要用另外一種方法來篩選,看了人家的部落格,感覺方法超好。這道題有個突破點,就是區間在1...