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
解决方案:很简单,先打表,筛选法。再二分答案;
code:#include<iostream> #include<cstdio> #include<cstring> #include<vector> #define MMAX 1000010 using namespace std; vector<int >prime; bool vis[MMAX]; int num[MMAX]; void prime_init1(){ memset(vis,false,sizeof(vis)); //memset(num,0,sizeof(num)); prime.push_back(2); for(int i=3; i<MMAX; i+=2) { // num[i]=num[i-1]; if(!vis[i]) { // num[i]++; prime.push_back(i); for(int j=i+i; j<MMAX; j+=i) vis[j]=true; } } }///打法一,虽效率比打法2高,但不能纪录每个前缀的素数的个数。 void prime_init2() { memset(vis,false,sizeof(vis)); memset(num,0,sizeof(num)); for(int i=2; i<MMAX; i++) { num[i]=num[i-1]; if(!vis[i]) { num[i]++; prime.push_back(i); for(int j=i+i; j<MMAX; j+=i) vis[j]=true; } } }///筛选法打打表,并记录每段前缀的素数个数 int a,b,k; bool get(int l) { for(int x=a; x<=b-l+1; x++) { if(num[x+l-1]-num[x-1]<k) return false; } return true; } int main() { prime_init2(); while(~scanf("%d%d%d",&a,&b,&k)) { int l; bool flag=false; if(num[b]-num[a-1]<k) { printf("-1\n"); continue; } int low=1,high=b-a+1,mid; int ans; while(low<=high){ mid=(high+low)/2; if(get(mid)){ ans=mid; high=mid-1; } else low=mid+1; }///二分查找l cout<<ans<<endl; } return 0; }