LightOJ 1197 Help Hanzo(区间素数筛选)
Posted Ritchie丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1197 Help Hanzo(区间素数筛选)相关的知识,希望对你有一定的参考价值。
水题
有t组数据 每组数据有a b 两个数 求a b之间有多少个素数 打表筛选即可
思路:先打一个素数表 找到第一个大于a的素数的倍数j 从j开始筛 筛到b为止 用flag标记 然后筛第二个素数 一直筛到sqrt(b)为止 剩下的就都是素数了 水题
#include <iostream> #include <math.h> #include <stdio.h> #include <string.h> #include <algorithm> #include <vector> #include <map> #include <queue> const int maxn=100005; typedef long long LL; LL p[maxn]; bool flag[maxn]; bool isp[maxn]; LL i,j,n,t,x,ans; LL a,b; void getprime() { memset(isp,0,sizeof(isp)); int k=0; for(i=2;i<=maxn;i++) { if(!isp[i]) //别忘了加[i] { p[k++]=i; for(j=i+i;j<=maxn;j=j+i) isp[j]=1; } } } using namespace std; int main() { getprime(); cin>>t; for(x=1;x<=t;x++) { cin>>a>>b; memset(flag,0,sizeof(flag)); if(a<2) a=2; for(i=0;p[i]*p[i]<=b;i++) { j=p[i]*(a/p[i]); if(j<a) j+=p[i]; if(j==p[i]) j+=p[i]; //貌似可以优化一下 for(;j<=b;j=j+p[i]) flag[j-a]=1; } ans=0; for(i=0;i<=b-a;i++) { if(!flag[i]) ans++; } cout<<"Case "<<x<<": "<<ans<<endl; } return 0; }
以上是关于LightOJ 1197 Help Hanzo(区间素数筛选)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1197 Help Hanzo(区间素数筛法)
B - Help Hanzo (LightOJ - 1197)
M - Help Hanzo LightOJ - 1197 (大区间求素数)