加载中...

[dmy737]质区间长度

质区间

传送门

埃氏筛/线性筛筛一遍,前缀和+二分查询即可

也有线性\(\mathcal O(n)\)作法,但没有二分容易实现,二分足矣。

注意特殊条件特判。

#include <bits/stdc++.h>
using namespace std;

int a[1000005];
bool vis[1000005];

int main() {
	int l, r, k;
	cin >> l >> r >> k;
	for(int i = 2; i <= r; i++) {
		if(i >= l && (!vis[i])) {
			a[i - l + 1] = a[i - l] + 1;  
		} 
		else if(i >= l) a[i - l + 1] = a[i - l];
		if(!vis[i]) {
			for(int j = i + i; j <= r; j += i) vis[j] = 1;
		}
	}
	int ans = -1;
	for(int i = 1; i <= r - l + 1; i++) {
		int x;
		if(!vis[l + i - 1]) {
			x = lower_bound(a + 1, a + r - l + 2, a[i] + k - 1) - a;
			if(x == r - l + 2) break;
			ans = max(ans, x - i + 1);
		}
		else {
			x = lower_bound(a + 1, a + r - l + 2, a[i] + k) - a;
			if(x == r - l + 2) break;
			ans = max(ans, x - i + 1);
		}
	}
	if(k == 0) cout << 1 ;
	else if(l == r) cout << -1;
	else cout << ans << endl;
	return 0;
} 
posted @ 2022-04-14 19:26  ZQYang  阅读(31)  评论(0)    收藏  举报