int prime[maxn],notprime[maxn],cnt=0,ans=0,prime2[maxn];
///cnt打表素数的个数,ans为区间[L,R]的素数的个数,prime2[maxn]从角标1开始存储区间素数的值;
void getprime1()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=maxn;i++)
{
if(!prime[i]) prime[++cnt]=i;
for(int j=1;j<=cnt;j++)
{
if(i*prime[j]>=maxn) break;
prime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
void getprime2(int L,int R)
{
ans=0;
memset(notprime,false,sizeof(notprime));
if(L<2) L=2;
for(int i=1;i<=cnt&&prime[i]*prime[i]<=R;i++)
{
LL temp=L/prime[i]+(L%prime[i]>0);
if(temp==1) temp=2;
for(LL j=temp;j*prime[i]<=R&&j*prime[i]>=L;j++) notprime[j*prime[i]-L]=true;
}
for(LL i=0;i<=R-L;i++) if(!notprime[i]) prime2[++ans]=i+L;
}
区间素数的筛选 得到区间素数的个数和值
最新推荐文章于 2022-05-08 00:13:28 发布