题目大意:

找到一个最小的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 }

 

 posted on 2014-07-27 21:50  Love风吟  阅读(142)  评论(0编辑  收藏  举报