spoj2 prime1 (区间筛)
Posted yimmortal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spoj2 prime1 (区间筛)相关的知识,希望对你有一定的参考价值。
给定t组询问,每组询问包括一个l和r,要求([l,r])的素数有哪些
其中(t le 10,1 le l le r le 1000000000 , r-l le 100000)
QwQ
我们可以观察到,这个题(r-l)的范围不是很大,而且所要求的区间也是连续的,所以
我们可以先预处理出(sqrt n)的素数,然后用它们筛掉所要查询的区间里的合数(注意特判1)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch==‘-‘) f=-1; ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
return x*f;
}
const int maxn = 3e5+1e2;
int check[maxn];
int prime[maxn];
int n,m,l,r;
int tot;
int oi[maxn];
void primee(int n)
{
check[1]=1;
for (int i=2;i<=n;i++)
{
if (!check[i]) prime[++tot]=i;
for (int j=1;j<=tot;j++)
{
if (i*prime[j]>n) break;
check[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
void solve(int l,int r)
{
for (int i=1;i<=tot;++i)
{
int p = prime[i];
if (prime[i]>r) break;
for (int j=(l-1)/p+1;j<=r/p;++j) if (p*j!=prime[i]) oi[p*j-l+1]=1;
}
}
int t;
int main()
{
primee(50000);
cin>>t;
//for (int i=1;i<=10;i++) cout<<prime[i]<<" "<<endl;
while (t--)
{
memset(oi,0,sizeof(oi));
l=read(),r=read();
solve(l,r);
if (l==1) oi[1]=1;
for (int i=1;i<=r-l+1;++i)
{
if (!oi[i]) printf("%d
",i+l-1);
}
cout<<"
";
}
return 0;
}
以上是关于spoj2 prime1 (区间筛)的主要内容,如果未能解决你的问题,请参考以下文章