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 l integers 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
乘法溢出 数组越界
AC代码:
#include<cstdio>
#include<cstring>
typedef long long LL;
const int MAXN=1e6+100;
int a,b,k,p[MAXN];
bool Judge(int mid)
{
int j=0;
for(j=a;j<=b-mid+1;++j)
{
if(p[mid+j-1]-p[j-1]<k) break;
}
return j<=b-mid+1?false:true;
}
int main()
{
memset(p,0,sizeof(p));
for(LL i=2;i<MAXN-33;++i) {//乘法溢出停止运行
if(!p[i]) {
for(LL j=i*i; j<MAXN-33;j+=i) p[j]=1;
}
}
for(int i=2;i<MAXN-33;++i) p[i]=p[i-1]+(!p[i]);//不要直接用MAXN小心越界
while(~scanf("%d %d %d",&a,&b,&k))
{
int L=1,R=b-a+1,ans=-1;
while(L<=R) {
int mid=(L+R)>>1;
if(Judge(mid)) {
ans=mid; R=mid-1;
}
else L=mid+1;
}
printf("%d\n",ans);
}
return 0;
}