You've decided to carry out a survey in the theory of prime numbers. Let us remind you that a prime number is a positive integer that has exactly two distinct positive integer divisors.
Consider positive integers a, a + 1, ..., b (a ≤ b). You want to find the minimum integer l (1 ≤ l ≤ b - a + 1) such that for any integer x (a ≤ x ≤ b - l + 1) among lintegers x, x + 1, ..., x + l - 1 there are at least k prime numbers.
Find and print the required minimum l. If no value l meets the described limitations, print -1.
A single line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 106; a ≤ b).
In a single line print a single integer — the required minimum l. If there's no solution, print -1.
2 4 2
3
6 13 1
4
1 4 3
-1
题意:给你一个闭区间[a,b],求一个最小的L,使得在区间[a,b-L+1]内任取一个数x,可以满足在x,x+1,x+2,……,x+L-2,x+L-1内至少包含k个素数。(1<=a,b,k<=10^6)
题解:素数打表,统计出每个区间有多少个素数,对L二分查找
code:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a,b,k;
int c[1000000+11];
int f[1000011];
int cheak(int mid){
for(int i=a;i<=b-mid+1;i++)
{
if(f[i+mid-1]-f[i-1]<k)
return 0;
}
return 1;
}
int main()
{
for(int i=2;i<=1000011;i++)
{
f[i]=f[i-1];
if(c[i]==1) continue;
f[i]++;
for(int j=2*i;j<=1000011;j+=i){
c[j]=1;
}
}//素数打表
while(~scanf("%d%d%d",&a,&b,&k)){
if(f[b]-f[a-1]<k) {
printf("-1\n");return 0;
}
int l=1;int r=b-a+1,ans;
while(l<=r){
int mid=(l+r)>>1;
if(cheak(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}

本文探讨了如何找到一个最小长度L,使得在给定区间[a,b]内的任意子区间[x,x+L-1]中都至少包含k个素数。通过预处理素数表并采用二分查找的方法来高效解决问题。
429

被折叠的 条评论
为什么被折叠?



