题目大意:
找到一个最小的l值,使得a到b-l+1中任取一个数开始前进l次,中间包含至少有k个素数,如果找不到,返回-1;
运用素数打表法和2分法便能简单搞定:
题目链接:http://codeforces.com/problemset/problem/237/C
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 7 #define N 1000100 8 int sum[N],pri[N],k,a,b; 9 void get_prim() 10 { 11 int t=(int)sqrt(N+0.5); 12 for(int i=0;i<N;i++) pri[i]=1; 13 pri[1]=0; 14 for(int i=2;i<=t;i++){ 15 for(int j=i+i;j<=N;j+=i) 16 pri[j]=0; 17 } 18 } 19 20 void get_sum() 21 { 22 get_prim(); 23 sum[1]=0,sum[2]=1; 24 for(int i=3;i<N;i++) 25 { 26 if(pri[i]) sum[i]=sum[i-1]+1; 27 else sum[i]=sum[i-1]; 28 } 29 } 30 bool Find(int l) 31 { 32 for(int j=a;j<=b-l+1;j++) 33 { 34 if((sum[j+l-1]-sum[j-1])<k) return false; 35 } 36 return true; 37 } 38 39 int main() 40 { 41 get_sum(); 42 int ans,start,last,mid; 43 while(scanf("%d%d%d",&a,&b,&k)!=EOF) 44 { 45 ans=b+2; 46 start=a,last=b; 47 while(start<=last) 48 { 49 mid=(start+last)/2; 50 if(Find(b-mid+1)) ans=mid,start=mid+1; 51 else last=mid-1; 52 } 53 cout<<b-ans+1<<endl; 54 } 55 return 0; 56 }
我还在坚持,我还未达到我所想,梦~~一直在