USACO快刷完了,从今天开始写SPOJ的题解了。
这一到题不难。
高斯筛法+埃拉托色尼筛法,先求出1-33000的所有素数,再用这些素数去求得区间内所有素数
/*
*NAME: prime1
*LANG: C++
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int prime[7000];
bool check[103000];
int n,m;
int main(){
//先求出1-33000的所有素数
memset(check,true,sizeof(check));
int tot=0;int N=32000;
for (int i=2;i<=N;++i){
if (check[i]) prime[tot++]=i;
for (int j=0;j<tot;++j){
if (i*prime[j]>N) break;
check[i*prime[j]]=false;
if (i%prime[j] == 0)break;
}
}
//solve
int k;scanf("%d",&k);
for (int t=1;t<=k;++t){
scanf("%d %d",&n,&m);if (n==1) n=2;
memset(check,true,sizeof(check));
for (int i=0;i<tot;++i)
for (int j=n/prime[i];j<=m/prime[i];++j)
if (prime[i]*j>=n && j!=1) check[prime[i]*j-n]=false;
for (int i=0;i<=m-n;++i)
if (check[i]) printf("%d\n",i+n);
printf("\n");
}
return 0;
}