【Primes on Interval】

来源:互联网 发布:多功能圣经软件下载 编辑:程序博客网 时间:2024/05/28 15:07
Primes on Interval
Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

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 aa + 1...b (a ≤ b). You want to find the minimum integer l (1 ≤ l ≤ b - a + 1) such that for any integerx (a ≤ x ≤ b - l + 1) among l integers xx + 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.

Input

A single line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 106a ≤ b).

Output

In a single line print a single integer — the required minimum l. If there's no solution, print -1.

Sample Input

Input
2 4 2
Output
3
Input
6 13 1
Output
4
Input
1 4 3
Output

-1

主要还是题意难以理解在区间 [a,b] 找出一个最小的区间长度 l 
使得区间[a,b]长度为l的子区间,含有至少k个质数
先打一个质数表,进行累加,用二分查找 l对每一个l进行验证,直到找到最小的l

<span style="font-size:18px;">#include<cstdio>#include<cstring>#define maxn 1000000int prime[maxn+11];int num[maxn+11];int a,b,k; void prime_table(){int i,j;memset(prime,0,sizeof(prime));memset(num,0,sizeof(num)); prime[0]=prime[1]=1;for(i=2;i<=maxn;++i){if(!prime[i]){for(j=i+i;j<=maxn;j+=i)prime[j]=1; } }prime[0]=prime[1]=0; for(i=2;i<=maxn;++i){if(prime[i])prime[i]=0;elseprime[i]=1;prime[i]+=prime[i-1]; } } int judge(int mid){int i;mid-=1;for(i=a;i+mid<=b;++i){if(prime[i+mid]-prime[i-1]<k)return 0; } return 1;} int main(){prime_table(); scanf("%d%d%d",&a,&b,&k);int l=1,r=b-a+1,mid,ans;if(prime[b]-prime[a-1]>=k){while(l<=r){mid=(l+r)>>1;if(judge(mid)){ans=mid;r=mid-1;} elsel=mid+1; }printf("%d\n",ans); }elseprintf("-1\n"); return 0; }</span><span style="font-size:14px;"> </span>


0 0
原创粉丝点击