还是挺简单的一道题,nlogn的算法很容易想 ,O(n)的就稍微麻烦了点
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;
#define PB push_back
#define MP make_pair
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define DWN(i,h,l) for(int i=(h);i>=(l);--i)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define MAX3(a,b,c) max(a,max(b,c))
#define MAX4(a,b,c,d) max(max(a,b),max(c,d))
#define MIN3(a,b,c) min(a,min(b,c))
#define MIN4(a,b,c,d) min(min(a,b),min(c,d))
#define PI acos(-1.0)
#define INF 1000000000
#define LINF 1000000000000000000LL
#define eps 1e-8
typedef long long ll;
const int MAXN=1e6+5;
bool notp[MAXN];
int pr[MAXN],pn;
void getprime()
{
pn=0;
memset(notp,0,sizeof(notp));
notp[1]=1;
for(int i=2;i<MAXN;i++)
{
if(!notp[i])pr[pn++]=i;
for(int j=0;j<pn && pr[j]*i<MAXN;j++)
{
notp[pr[j]*i]=1;
if(i%pr[j]==0)break;
}
}
}
int a,b,k;
int sum[MAXN];
int check(int mid)
{
FOR(i,a,b-mid+1)
{
if(sum[i+mid-1]-sum[i-1]<k)
return 0;
}
return 1;
}
int solve()
{
int l=1,r=b-a+1,mid,ans=-1;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
r=mid-1;
ans=mid;
}
else
l=mid+1;
}
return ans;
}
int main()
{
getprime();
cin>>a>>b>>k;
CLR(sum);
FOR(i,a,b)
sum[i]=sum[i-1]+(notp[i]==0);
int ans=solve();
cout<<ans<<endl;
return 0;
}
这是别人的O(n)算法
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-8
#define DEBUG(a) cout<<#a" = "<<(a)<<endl;
#define DEBUGARR(a,n) for(int i=0;i<(n);i++) {cout<<#a"["<<i<<"] = "<<(a)[i]<<endl;}
#define pi acos(-1.0)
using namespace std;
#define maxn 1111111
int pri[maxn], cnt;
int mark[maxn];
void sieve() {
int i, j;
cnt=1, pri[0] = 2;
for (i = 3; i < maxn; i += 2) {
if (!mark[i]) pri[cnt++] = i;
for (j = 1; j < cnt, pri[j] * i < maxn; ++j) {
mark[ i * pri[j] ] = 1;
if ( !(i % pri[j]) ) break;
}
}
}
int main()
{
#ifdef StyleTang_Code
freopen("123.in","r",stdin);
freopen("123.out","w",stdout);
#endif
int i,j;
sieve();
for(i=0;i<maxn;i+=2)
mark[i]=1;
mark[1]=1;
mark[2]=0;
int a,b,k;
while(cin>>a>>b>>k)
{
int len=0;
int le=a;
int cnt=0;
if(mark[a]==0)
cnt=0;
for(i=a;i<=b;i++)
{
cnt=cnt+(mark[i]==0)-(mark[le]==0);
if(cnt>=k)
{
le++;
continue;
}
else
{
cnt=cnt+(mark[le]==0);
if(cnt>=k)
{
len++;
continue;
}
else
len++;
while(cnt<k&&i<=b)
{
i++;
cnt=cnt+(mark[i]==0);
len++;
}
if(i>b)
len=-1;
}
}
if(cnt<k)
len=-1;
cout<<len<<endl;
}
return 0;
}