LightOJ 1197(大数范围筛区间内素数个数)
2017-05-02 21:24
330 查看
对于大范围内的素数个数,可以通过模拟筛法筛区间内素数个数,先打表,再根据表进行筛素数操作
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cassert> #include <iostream> #include <string> #include <vector> using namespace std; typedef long long ll; const int MAXN = 1000000+10; bool is_prime[MAXN];//true的为合数,false的为素数 int prime[MAXN/10];//存素数 bool num[MAXN]; int tol; void find_prime() { memset(is_prime,false,sizeof(is_prime)); tol=0; is_prime[1]=1; for(int i=2; i<MAXN; i++) { if(!is_prime[i]) { prime[tol++]=i; for(int j=i*2; j<MAXN; j+=i) is_prime[j]=1; } } } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int T; cin>>T; find_prime(); for(int cas=1; cas<=T; cas++) { int a,b; scanf("%d %d",&a,&b); int n=b-a; memset(num,false,sizeof(num)); for(int i=0;i<tol&&prime[i]*prime[i]<=b;i++) { int j=0; if(a%prime[i]!=0) j=prime[i]-a%prime[i];//找到第一个需要筛掉的数(j+a)%prime[i]==0 if(a<=prime[i]) j+=prime[i];//(j+a)/prime[i]==1,则(j+a)是素数,向下推一个 for(;j<=n;j+=prime[i]) num[j]=true; } int ans=0; for(int j=0;j<=n;j++) { if(!num[j]) ans++; } if(a==1) ans--; printf("Case %d: %d\n",cas,ans); } return 0; }
相关文章推荐
- LightOJ 1197 Help Hanzo 求区间内素数的个数
- LightOJ 1197 Help Hanzo(区间素数筛选)
- Help Hanzo(区间求素数) LightOJ - 1197 板子题
- LightOJ1197 - Help Hanzo(区间素数筛 + 模板)
- [大区间素数] lightoj 1197
- LightOJ 1197 - Help Hanzo 【思维找素数 -> 区间素数筛选】
- lightOJ 1197 Help Hanzo (区间找素数)
- LightOJ 1197 区间素数筛(注意溢出的处理)
- LightOJ 1197 Help Hanzo (区间素数筛选法)
- LightOJ 1197 LightOJ 1197(大区间素数筛选)
- LightOj 1197 Help Hanzo (区间素数筛选)
- LightOj 1197 - Help Hanzo(分段筛选法 求区间素数个数)
- LightOJ 1197 Help Hanzo(区间素数筛选)
- LightOJ 1197 Help Hanzo(区间素数筛)
- lightoj1197区间素数筛
- Help Hanzo lightof 1197 求一段区间内素数个数,[l,r] 在 [1,1e9] 范围内。r-l<=1e5; 采用和平常筛素数的方法。平移区间即可。
- LightOJ - 1197 Help Hanzo 较大数的区间素数筛法
- Python实现输出某区间范围内全部素数的方法
- LightOJ - 1197 Help Hanzo 素数筛
- lightOJ 1197 Help Hanzo 两阶段素数筛选