码迷,mamicode.com
首页 > 其他好文 > 详细

LightOJ 1197 Help Hanzo(区间素数筛选)

时间:2016-03-19 21:24:16      阅读:468      评论:0      收藏:0      [点我收藏+]

标签:

水题

有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(区间素数筛选)

标签:

原文地址:http://www.cnblogs.com/Ritchie/p/5296214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!