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

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

时间:2019-11-27 12:38:28      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:pre   amp   main   get   简单   完成   using   case   ons   

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;
}


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

标签:pre   amp   main   get   简单   完成   using   case   ons   

原文地址:https://www.cnblogs.com/satchelpp/p/11941151.html

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