您的位置:首页 > 其它

[暑假集训--数论]poj3518 Prime Gap

2017-08-04 15:24 162 查看
The sequence of n − 1 consecutive composite numbers (positive integers that are not prime and not equal to 1) lying between two successive prime numbers p and p + n is called a prime gap of length n. For example, ‹24, 25, 26, 27, 28› between 23 and 29 is a prime gap of length 6.

Your mission is to write a program to calculate, for a given positive integer k, the length of the prime gap that contains k. For convenience, the length is considered 0 in case no prime gap contains k.

Input

The input is a sequence of lines each of which contains a single positive integer. Each positive integer is greater than 1 and less than or equal to the 100000th prime number, which is 1299709. The end of the input is indicated by a line containing a single zero.

Output

The output should be composed of lines each of which contains a single non-negative integer. It is the length of the prime gap that contains the corresponding positive integer in the input if it is a composite number, or 0 otherwise. No other characters should occur in the output.

Sample Input

10
11
27
2
492170
0

Sample Output

4
0
6
0
114

给个x,如果x夹在两个质数a,b之间,求b-a,否则输出0

在筛法的时候预处理下距离就好

1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #define LL long long
5 using namespace std;
6 inline LL read()
7 {
8     LL x=0,f=1;char ch=getchar();
9     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
10     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
11     return x*f;
12 }
13 LL n;
14 bool mk[2000010];
15 int p[2000010],len;
16 int ans[2000010];
17 inline LL LLabs(LL a){return a<0?-a:a;}
18 inline void getp()
19 {
20     memset(ans,-1,sizeof(ans));
21     for (int i=2;i<=2000000;i++)
22     {
23         if (!mk[i])
24         {
25             p[++len]=i;
26             ans[i]=0;
27             for (int j=2*i;j<=2000000;j+=i)mk[j]=1;
28         }else ans[i]=ans[i-1]+1;
29     }
30     for (int i=2000000;i>=1;i--)
31     {
32         if (!ans[i])continue;
33         ans[i]=max(ans[i],ans[i+1]);
34     }
35 }
36 int main()
37 {
38     getp();
39     ans[1]=-1;
40     while (~scanf("%lld",&n)&&n)printf("%d\n",ans
?ans
+1:0);
41 }


poj 3518
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: