Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】 (未完成)

Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】 (未完成)

标签: 入门讲座题解 数论


题目描述


题意


解析


通过代码


/*
Problem
    LightOJ - 1997
Status
    Accepted
Time
    105ms
Memory
    15856kB
Length
    1168
Lang
    C++
Submitted
    2019-11-25 19:11:37
RemoteRunId
    1640684
*/

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e7 + 50;
typedef long long ll;

bool vis[MAXN], _vis[100005];
int prime[MAXN / 10], cnt = 0;


void get_prime()           //欧拉线性筛.先筛出sqrt(n)范围内的质数.
{
    vis[1] = 1;

    for(int i = 2; i <= int(1e6 + 5); i ++){
        if(!vis[i])
            prime[++ cnt] = i;


        for(int j = 1; j <= cnt && i * prime[j] <= int(1e6 + 5); j ++){
            vis[i * prime[j]] = 1;
            if(i % prime[j] == 0)
                break;
        }
    }

    return;
}
int main()
{

    int times, _case = 0;

    get_prime();

    scanf("%d", &times);

    while(times --){
        ll a, b;
        int ans = 0;

        memset(_vis, 0, sizeof(_vis));
        scanf("%lld%lld", &a, &b);
        if(a == 1) _vis[0] = 1;       //如果a是1. 1不是质数,但无法通过我们的方法筛掉1.所以先手动筛掉.

        for(int i = 1; i <= cnt && 1ll * prime[i] * prime[i] <= b; i ++)    //用小于sqrt(b)的素数,开始筛掉[1, b]区间的合数.
            for(ll j = a / prime[i] * prime[i]; j <= b; j += prime[i]){
                if(j >= a && j > prime[i])       //要让j落在区间中,且j是合数.
                    _vis[j - a] = 1;
            }

        for(int j = 0; j < b - a + 1; j ++)
            if(!_vis[j])
                ans ++;
                    
        printf("Case %d: %d\n", ++ _case, ans);
    }
    return 0;
}


猜你喜欢

转载自www.cnblogs.com/satchelpp/p/11941151.html