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 (大区间求素数)

Light oj 1197 - Help Hanzo (素数筛技巧)

Help Hanzo (素数筛+区间枚举)

LightOJ 1197(区间素数筛)