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

标签: 入门讲座题解 数论


题目描述

Amakusa, the evil spiritual leader has captured the beautiful princess Nakururu. The reason behind this is he had a little problem with Hanzo Hattori, the best ninja and the love of Nakururu. After hearing the news Hanzo got extremely angry. But he is clever and smart, so, he kept himself cool and made a plan to face Amakusa.

Before reaching Amakusa's castle, Hanzo has to pass some territories. The territories are numbered as a, a+1, a+2, a+3 ... b. But not all the territories are safe for Hanzo because there can be other fighters waiting for him. Actually he is not afraid of them, but as he is facing Amakusa, he has to save his stamina as much as possible.

He calculated that the territories which are primes are safe for him. Now given a and b he needs to know how many territories are safe for him. But he is busy with other plans, so he hired you to solve this small problem!

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each case contains a line containing two integers a and b (1 ≤ a ≤ b < 231, b - a ≤ 100000).

Output

For each case, print the case number and the number of safe territories.

Sample Input

3

2 36

3 73

3 11

Sample Output

Case 1: 11

Case 2: 20

Case 3: 4

Note

A number is said to be prime if it is divisible by exactly two different integers. So, first few primes are 2, 3, 5, 7, 11, 13, 17, ...

题意

给定\(l, r\),问区间\([l, \;r]\)内有几个质数?


解析

因为\(n\)较大,且区间长度最大为\(1e5\),所以不能直接使用朴素\(O(\sqrt{n})\)的方法来逐个判断区间的质数。

那么我们可以将埃氏筛的思想运用到区间上。用所有比\(r\)小的质数数来筛掉\([l, \;r]\)区间中的合数。用欧拉筛提前处理出\(\sqrt{N}\)以内的质数。然后用这些质数去筛掉\([l,\;r]\)区间的合数。这样这个算法的时间复杂度就是\(O(len\log \log{len})\)了。

quiz为什么只需要筛出\(\sqrt{N}\)以内的素数?

埃氏筛中,一个质数\(p\)所能筛掉的第一个合数为\(p \times p\)(\(p \times 2, p \times 3, p \times 4, \dots\) 都在之前被其他的质数筛掉了。)如果\(p\)能筛掉的最小合数都比\(N\)大,那么这个\(p\)就是用不到的,就不用筛出这个\(p\)来。


通过代码

/*
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 = max(1ll * prime[i] * prime[i], a / prime[i] * prime[i]); j <= b; j += prime[i]){ //找到落在区间内的,能被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) 【简单数论】【筛区间质数】的更多相关文章

  1. M - Help Hanzo LightOJ - 1197 (大区间求素数)

    题意: 求[a,b]之间的素数的个数 数很大...数组开不起 所以要想到转化 因为小于等于b的合数的最小质因子 一定小于等于sqrt(b),所以只需要求出来[0,sqrt(b)]的素数  然后取倍数删 ...

  2. M - Help Hanzo LightOJ - 1197 (大区间素数筛法)

    题解:素数区间问题.注意到a和b的范围是1<<31,所以直接暴力打表肯定不可以.如果一个数是合数,他的两个因子要么是两个sqrt(x),要么就分布在sqrt(x)两端,所以我们可以根据sq ...

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

    E - Help Hanzo Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  4. Pairs Forming LCM (LightOJ - 1236)【简单数论】【质因数分解】【算术基本定理】(未完成)

    Pairs Forming LCM (LightOJ - 1236)[简单数论][质因数分解][算术基本定理](未完成) 标签: 入门讲座题解 数论 题目描述 Find the result of t ...

  5. Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】

    Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...

  6. Sigma Function (LightOJ - 1336)【简单数论】【算术基本定理】【思维】

    Sigma Function (LightOJ - 1336)[简单数论][算术基本定理][思维] 标签: 入门讲座题解 数论 题目描述 Sigma function is an interestin ...

  7. Goldbach`s Conjecture(LightOJ - 1259)【简单数论】【筛法】

    Goldbach`s Conjecture(LightOJ - 1259)[简单数论][筛法] 标签: 入门讲座题解 数论 题目描述 Goldbach's conjecture is one of t ...

  8. 简单实现图片间的切换动画 主要用到ViewPager

    简单实现图片间的切换动画 主要用到ViewPagerViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view.ViewPager类需要一个PagerAdapter适 ...

  9. (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)

    题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...

随机推荐

  1. python之MiniWeb框架

    以往,我们多完成的是静态web服务器,主要处理的都是一些已经‘写死’的数据,那么今天,我们来学习一下动态数据的处理. 说到动态数据,我们就需要了解一个东西,那就是web框架. 所谓web框架简单地说就 ...

  2. 面试题:为什么客户端最后还要等待2MSL

    面试题: 为什么客户端最后还要等待2MSL MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值. 保证客户端发送的最后一个ACK报文能够到达服务器, ...

  3. 中文分词接口api,采用结巴分词PHP版中文分词接口

    中文分词,分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字.句和段能通过明显的分界符来简单划界,唯独词没有一个形式上 ...

  4. 《Java练习题》进阶练习题(四)

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题. [程序78 ...

  5. C#线程学习笔记五:线程同步--事件构造

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Event_Constructor.html,记录一下学习过程以备后续查用. 前面讲的线 ...

  6. MySql事务的简单使用

    4个特性 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态 一致性:在事务开始前和事务结束以 ...

  7. ImportError: No module named flask 导包失败,Python3重新安装Flask模块

    在部署环境过程中,通过pip install -r requirements.txt安装包,结果启动项目时总是报错,显示没有flask模块,通过pip install flask还是不行,于是下载fl ...

  8. everspin自旋转矩MRAM技术

    MRAM的主体结构由三层结构的MTJ构成:自由层(free layer),固定层和氧化层.自由层与固定层的材料分别是CoFeB和MgO.MRAM 是一种非易失性的磁性随机存储器.它拥有静态随机存储器( ...

  9. docker网络配置

    Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用--net去指定,其他三种模式需 ...

  10. eth-trunk学习笔记

    转载自https://blog.csdn.net/qq_38265137/article/details/80404340