您的位置:首页 > 其它

Primes on Interval+codeforces+筛选法打表

2014-07-27 20:30 471 查看
Primes on Interval

time limit per test
2 seconds

memory limit per test
256 megabytes

input
standard input

output
standard output

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 test(s)

Input
2 4 2


Output
3


Input
6 13 1


Output
4


Input
1 4 3


Output
-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;
}

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