Primes on Interval(素数打表+二分)

来源:互联网 发布:淘宝手机版详情页尺寸 编辑:程序博客网 时间:2024/06/15 08:05

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 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.

Input
A single line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 106; a ≤ 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,k,问你在[a,b]里是否存在l使得a<=l<=b里有任意x,满足[x,x+l]里至少有k个素数

#include<stdio.h>#include<math.h>#include<string.h>#define maxx 1000010int r,prime[maxx],vis[maxx],cnt[maxx];void wprime(){    int m=(int)sqrt(1000000+1);      r=0;      memset(vis,0,sizeof(vis));      vis[0]=1;      vis[1]=1;      for(int i=2;i<=m;++i)    {          if(!vis[i])         {              prime[r++]=i;              for(int j=i*i;j<=1000005;j+=i)                  vis[j]=1;          }    }}void dabiao()//打二分表,cnt数组储存的是从0开始到这里有多少个素数{    wprime();    cnt[0]=0;    for(int i=1;i<=1000000;++i)    {          if(!vis[i])  cnt[i]=cnt[i-1]+1;          else           cnt[i]=cnt[i-1];     }}int check(int a,int b,int k,int l)//检查是否满足题意{      int r=b-l+1;      for(int i=a;i<=r;++i)    {          if(cnt[i+l-1]-cnt[i-1]>=k)              continue;          else              return 0;      }      return 1;  }  int erfen(int a,int b,int k){    int L=1,R=b-a+1,mid;      while(L<=R)    {          mid=(L+R)/2;          if(check(a,b,k,mid))              R=mid-1;          else              L=mid+1;     }      return L;  }int main(){    int a,b,k;    dabiao();    while(scanf("%d%d%d",&a,&b,&k)!=EOF)    {        if(!check(a,b,k,b-a+1))  printf("-1\n");//如果最大的范围里都没有k个素数,说明不存在l值,输出-1        else        {            printf("%d\n",erfen(a,b,k));        }    }    return 0;}
0 0
原创粉丝点击